精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一文徹底搞明白備忘錄模式

開發 前端
面向對象程序中,一個類在生命周期過程中,其屬性構成的狀態是會不斷變化的。這種變化會帶來很多不確定性,尤其在多線程場景下,可能也會引發一些意想不到的問題。

本篇講解Java設計模式中的備忘錄模式,分為定義、模式應用前案例、結構、模式應用后案例、適用場景、模式可能存在的困惑和本質探討7個部分。

定義

備忘錄模式是在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態,這樣以后就可以將該對象恢復到保存的狀態。

在新的分類方式中,備忘錄模式被劃分至類屬性相關需求類別中,其應對的是類的狀態屬性需要恢復的要求。

模式應用前案例

文本編輯器是一個備忘錄模式的典型應用場景。接下來,先來看一下未使用備忘錄模式之前的代碼實現。

public class TextEditor {//編輯器類-直接實現保存和恢復操作
private String content;
private String previousContent;

public void write(String text) {
if(this.content == null ) {
this.content = "";
        }
this.content += text;
    }

// 保存當前內容為上一個版本的狀態
public void save() {
this.previousContent = this.content;
    }

// 恢復到上一個版本的狀態
public void undo(){
if(this.previousContent != null){
this.content = this.previousContent;
        }
    }

// 獲取內容
public String getContent(){
return this.content;
    }

}

public class Client {//調用方代碼
public static void main(String[] ars){

        TextEditor editor=new TextEditor();

        editor.write("Hello, ");
        System.out.println(editor.getContent());

        editor.save();

        editor.write("World!");

        System.out.println(editor.getContent());

        editor.undo();

        System.out.println(editor.getContent());
    }
}

在上述代碼中,主要問題出現在TextEditor類中。為了實現恢復到上一步這個操作,在類中增加了previousContent屬性。

如果這個功能是后來才需要增加的,則違背了OCP開閉原則。此外,如果后續要增加恢復上兩步的操作,是否還要新增一個doublepreviousContent屬性。顯然,對于這種類狀態(或屬性)有變化且能夠恢復的場景,應該有更好的解決方案。

結構

備忘錄模式的示例實現代碼如下。

public class Originator {
private String state;

public Memento createMemento() {
return new Memento(state);
    }

public void setMemento(Memento memento) {
this.state = ((Memento) memento).getState();
    }

public String getState() {
return state;
    }

public void setState(String state) {
this.state = state;
    }
}

public class Memento{
private final String state;

public Memento(String state) {
this.state = state;
    }

public String getState() {
return state;
    }

}

public class Caretaker {

private Memento memento;

public void setMemento(Memento memento) {
this.memento = memento;
    }

public Memento getMemento() {
return memento;
    }
}

public class Client {
public static void main(String[] args) {
// 創建Originator對象
        Originator originator = new Originator();

// 設置初始狀態
        originator.setState("State 1");
        System.out.println("Initial State: " + originator.getState());

// 創建Caretaker對象并保存備忘錄
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(originator.createMemento());

// 改變Originator的狀態
        originator.setState("State 2");
        System.out.println("State after change: " + originator.getState());

// 恢復到之前保存的狀態
        originator.setMemento(caretaker.getMemento());
        System.out.println("State after restore: " + originator.getState());
    }
}

從備忘錄模式的結構和示例代碼中,可以看到原有類Originator僅保留了與自身核心業務功能相關的屬性,并將其需要恢復狀態的屬性state放在一個Memento類中保存。

Originator增加了兩個比較簡潔的方法,一個是創建Memento,一個是從Memento中恢復,所以setMemento方法使用restoreFromMemento會更加準確。

同時,增加了一個Caretaker類,它用于保存、恢復Memento。是恢復到上一個狀態還是上兩個狀態都由Caretaker類專門負責。

不難發現,在備忘錄模式下,各個類職責分工明確,核心類Originator專注于核心業務功能,Memento和Caretaker兩個支撐類則用于實現狀態的保存和恢復。

模式應用后案例

上面文本編輯器的案例,在應用備忘錄模式之后的代碼實現如下。

TextEditor類刪掉了PreviousContent屬性,職責更加單一。

public class TextEditor {// 編輯器類(Originator)- 負責創建備忘錄和恢復到之前狀態

private String content;

public void write(String text) {
if(this.content == null) {
this.content = "";
        }
this.content += text;
    }

// 創建當前內容對應的備份
public EditorMemento createMemento(){
return new EditorMemento(this.content);
    }

// 從傳入Mememtor對象中獲取內容并進行還原
public void restoreFromMemento(EditorMemento memento){
this.content = memento.getContent();
    }

public String getContent() {
return this.content;
    }
}

增加EditorMemento和UndoManager兩個類,分別實現TextEditor中Content屬性的保存,以及EditorMemento的管理。

public class EditorMemento {// 備忘錄類(Memento)- 存儲文本編輯器的狀態

private final String content;

public EditorMemento(String content) {
this.content = content;
    }

public String getContent() {
return this.content;
    }

}

public class UndoManager {// 管理者類(Caretaker)-負責管理保存和恢復操作

    Stack<EditorMemento> emStack =new Stack<>();

public void save(EditorMemento memento){
this.emStack.push(memento);
    }

public EditorMemento undo(){
if(!this.emStack.empty()){
return this.emStack.pop();
        }
return null;
    }
}

最后,調用方代碼如下。

public class Client {//調用方代碼

public static void main(String[] ars){

        TextEditor editor = new TextEditor();

        UndoManager undoManager=new UndoManager();

        editor.write("Hello, ");

        undoManager.save(editor.createMemento());

        editor.write("World!");

//undoManager.save(editor.createMemento());

        System.out.println(editor.getContent());

        editor.restoreFromMemento(undoManager.undo());

        System.out.println(editor.getContent());
    }
}

適用場景

備忘錄模式適用的場景非常明確,就是原有類在生命周期變化過程中,其屬性的狀態還可能需要恢復的場景。

模式可能存在的困惑

困惑1:為什么要有Caretaker類,為什么不能在Memento或Originator中實現保存和恢復功能,這樣程序更加簡潔?

如果在Originator中實現,又違背了SRP單一職責和OCP開閉原則;如果在Memento實現,這個類功能會變多,每次在Originator中創建Memento對象會占用更多內存,從這個角度就不合適。

困惑2:Memento類只是一個數據的封裝類,為什么Originator的狀態屬性不能直接放在Caretaker中通過一個數據屬性來實現?

實際上,許多人在考慮狀態恢復的策略時,通常會優先想到這個方案。為了更好地進行說明,這里將代碼實現羅列出來。

public class TextEditor {// 編輯器類(Originator)- 負責創建備忘錄和恢復到之前狀態

private String content;

public void write(String text) {
if(this.content == null) {
this.content = "";
        }
this.content += text;
    }

// 創建當前內容對應的備份
public void saveContent(){
        UndoManager.save(this.content);
    }

// 獲取內容并進行還原
public void restoreFromContent(){
this.content = UndoManager.undo();
    }

public String getContent() {
return this.content;
    }
}

public class UndoManager {// 管理者類(Caretaker)-負責管理保存和恢復操作

private static final Stack<String> emStack =new Stack<>();

public static void save(String content){
        emStack.push(content);
    }

public static String undo(){
if(!emStack.empty()){
return emStack.pop();
        }
return null;
    }
}
public class Client {//調用方代碼

public static void main(String[] ars){

        TextEditor editor = new TextEditor();

        editor.write("Hello, ");

        editor.saveContent();

        editor.write("World!");

        System.out.println(editor.getContent());

        editor.restoreFromContent();

        System.out.println(editor.getContent());
    }
}

這種方式下,似乎實現起來更加簡潔清晰。然而,缺點也比較明顯。TextEditor與UndoManager緊耦合的情況下,如果TextEditor要求也能夠實現恢復到前兩個狀態,此時UndoManager增加了一個undo2的方法,那么TextEditor也需要一并修改。

但是在備忘錄模式下,TextEditor相當于至于純數據類Memento進行交互,面對上面的需求并不需要修改,只需要將上兩個的Memento傳參即可。

困惑3:在關于備忘錄模式的一些材料中,會看到寬接口和窄接口,具體是什么含義?

寬接口指的是Memento備忘錄對象提供給Originator訪問其內部狀態的全部信息,包括私有數據。因為Memento里的數據其實就是Originator中要保存、恢復狀態的數據,因此Originator需要能訪問到具體的數據信息才可以。

窄接口指的是Memento備忘錄對象對Caretaker對象指提供必要的信息進行訪問和恢復操作。因為Caretaker對象需要是是Memento對象自身,并不需要訪問Memento中的數據,因此稱之為窄接口。

困惑4:備忘錄模式實現之后,對于調用方的交互似乎變得更加復雜?

一件事情往往有得必有失,很難做到兩全其美。為了使得Originator不違背SRP單一職責和OCP開閉原則,Client只能增加交互。

如果在Client和備忘錄模式的類之間增加一個中間代理類,這樣可以減少與調用方之間的交互,但是代價是又新增一個支撐類。

本質

面向對象程序中,一個類在生命周期過程中,其屬性構成的狀態是會不斷變化的。這種變化會帶來很多不確定性,尤其在多線程場景下,可能也會引發一些意想不到的問題。因此,Java語言中經常提倡要利用不變性、局部變量等應對這種不確定性。

然而,在某些現實場景下,類隨著時間不斷變化是有必要的,并且要求還能沿著時間向后回退。此時,備忘錄提供了一種管理對象狀態的機制,并且讓原有對象維持良好的封裝性。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2024-05-10 08:43:04

外觀模式接口系統

2024-05-13 10:45:25

中介模式面向對象數量

2024-05-09 09:09:19

組合模式對象

2024-05-11 14:18:44

迭代器模式業務

2024-05-17 10:08:59

享元模式分類方式

2019-08-27 14:46:59

ElasticSearES數據庫

2020-11-02 10:41:33

備忘錄模式

2020-07-10 08:03:35

DNS網絡ARPAne

2023-05-29 08:45:45

Java注解數據形式

2025-02-17 14:48:14

2023-10-07 00:14:53

2018-12-24 21:40:12

2023-03-13 08:12:37

Golang編程路徑問題

2023-10-31 09:07:16

備忘錄模式保存

2019-09-09 11:02:17

Nginx進程模型

2011-08-16 18:38:23

Core Animat動畫

2011-04-11 10:03:32

錢伯斯思科

2017-03-21 11:02:59

基礎深度學習備忘錄

2021-05-06 08:03:07

IPIP網絡模式calicok8s

2023-10-10 15:26:30

內存泄露OOM
點贊
收藏

51CTO技術棧公眾號

亚洲综合精品四区| 激情五月色综合国产精品| 亚洲高清在线精品| 麻豆成人在线播放| 97av免费视频| 亚洲伦伦在线| 社区色欧美激情 | 香蕉视频免费网站| 亚洲伦乱视频| 亚洲欧美电影一区二区| 久久久久久国产精品mv| 伊人网免费视频| 亚洲精品护士| 久久久成人精品视频| www.超碰97| 国产精品1区| 在线亚洲人成电影网站色www| 永久免费看av| 国产免费a∨片在线观看不卡| 国产一区二区三区蝌蚪| 欧亚精品在线观看| 久草福利资源在线观看| 久久精品国产www456c0m| 亚洲精品一区二区在线| 被黑人猛躁10次高潮视频| 电影网一区二区| 亚洲香肠在线观看| 咪咪色在线视频| 精品美女视频在线观看免费软件 | 欧美日韩导航| 91精品一区二区三区在线观看| 男人操女人免费软件| 污污视频在线| 日韩一区欧美一区| 午夜精品短视频| 日韩精品系列| 99久久婷婷国产综合精品电影| 91成人免费在线观看| 97成人在线观看| 日本欧美大码aⅴ在线播放| 欧美性资源免费| 日韩字幕在线观看| 激情91久久| 欧美高清在线观看| 草视频在线观看| 欧美一区二区| 久久香蕉频线观| 中文国语毛片高清视频| 日韩欧美不卡| 自拍偷拍亚洲一区| 国产99在线 | 亚洲| 精品国产一区二区三区四区| 亚洲美女又黄又爽在线观看| 中文字幕人妻一区二区| 亚洲区小说区图片区qvod| 精品无人区乱码1区2区3区在线 | 久久综合五月婷婷| 精品国产免费一区二区三区香蕉 | 久久综合国产精品| 开心色怡人综合网站| 头脑特工队2在线播放| 91丨porny丨国产入口| 精品国产综合区久久久久久| 五月婷婷在线播放| www激情久久| 久久久久久国产精品mv| 国产三区四区在线观看| 国产精品污www在线观看| 亚洲一区三区电影在线观看| 国产黄大片在线观看画质优化| 亚洲欧美视频在线观看视频| 国产一级大片免费看| 手机av在线播放| 亚洲五月六月丁香激情| av免费播放网址| 欧美性片在线观看| 5月丁香婷婷综合| 少妇极品熟妇人妻无码| 秋霞影视一区二区三区| 亚洲欧美日本另类| 天天爽天天爽天天爽| 激情欧美丁香| 国产成人精品午夜| 国产精品视频在线观看免费| 大白屁股一区二区视频| 欧美一区视久久| 成人免费网址| 午夜精品爽啪视频| 亚洲综合在线网站| 国产视频一区二| 国产午夜精品麻豆| 国产传媒免费在线观看| 99re国产精品| 成人av在线网址| 性xxxx视频播放免费| 国产精品久久久久久福利一牛影视| 日韩一级免费看| 成人黄色免费短视频| 51午夜精品国产| 亚洲第九十七页| 天天影视综合| 57pao成人国产永久免费| 国产精品亚洲lv粉色| av在线综合网| 日本女人高潮视频| 国产日韩电影| 日韩女优毛片在线| 久久久免费看片| 99精品视频免费全部在线| 国产日韩欧美一二三区| 四虎影视在线观看2413| 亚洲欧洲中文日韩久久av乱码| 北条麻妃在线一区| 99久久香蕉| 久久久精品在线观看| 日韩欧美在线观看免费| 成人免费黄色在线| 久久精品国产精品亚洲精品色 | 中国成人一区| 国产精品第三页| 香港三日本三级少妇66| 一区二区三区精品视频| 青青草久久伊人| 神马电影久久| 97超级碰碰碰久久久| 亚洲第一天堂影院| 亚洲色图视频免费播放| 一区二区三区免费播放| 亚洲三级精品| 欧美一级视频一区二区| 丰满肉肉bbwwbbww| 亚洲精品高清在线观看| 午夜精品久久久久久久99热影院| 成人6969www免费视频| 欧美最近摘花xxxx摘花| 五月激情婷婷综合| 亚洲成人av一区| 亚洲一区和二区| 欧美全黄视频| 成人黄动漫网站免费| 国产秀色在线www免费观看| 欧美精品一二三区| 日韩福利小视频| 开心九九激情九九欧美日韩精美视频电影| 青青成人在线| 成人美女黄网站| 亚洲欧洲成视频免费观看| 日韩免费黄色片| www.欧美色图| 欧美亚洲另类色图| 在线看成人短视频| 国产精品九九久久久久久久| 色猫av在线| 一本一道久久a久久精品综合蜜臀 一本一道综合狠狠老 | 三上悠亚作品在线观看| 狠狠色狠狠色综合日日91app| 午夜精品短视频| 日韩av懂色| 美女视频久久黄| www.我爱av| 亚洲国产欧美在线人成| 亚洲精品乱码久久久久久久| 国产精品一页| 亚洲电影网站| 国产美女视频一区二区| 欧美精品在线观看| 日本xxxxwww| 色狠狠综合天天综合综合| 欧美三级视频网站| 狠狠色丁香婷综合久久| 亚洲 欧美 综合 另类 中字| 日本韩国欧美超级黄在线观看| 欧美在线不卡区| 中文字幕在线免费| 日韩欧美亚洲国产精品字幕久久久| 久久久久久久中文字幕| 久久午夜老司机| 久久人人爽av| 黑人一区二区| 狼狼综合久久久久综合网| jizz欧美| 久久久免费观看视频| 美女毛片在线看| 91精品国产乱| 九九热在线免费观看| 国产精品乱码一区二区三区软件| 亚洲一区二区图片| 免费一区视频| 久久免费一级片| 亚洲宅男一区| 亚洲影院色无极综合| 在线毛片观看| 久久成人亚洲精品| 精品久久av| 欧美videofree性高清杂交| 亚洲欧美日韩激情| 亚洲精品国产精品乱码不99| 精品国产av无码| 国产精品一区一区三区| 一本色道无码道dvd在线观看| 亚洲女同另类| 欧美自拍资源在线| 成人av影音| 成人做爽爽免费视频| 中文字幕资源网在线观看免费| 久久深夜福利免费观看| 九色国产在线观看| 亚洲精品成人网| 国产裸体无遮挡| 在线观看不卡视频| 在线观看免费国产视频| 亚洲人妖av一区二区| 这里只有久久精品| 成人精品国产免费网站| 亚洲精品综合在线观看| 快she精品国产999| 日韩av在线播放不卡| 自拍欧美日韩| 91免费视频黄| 欧美日韩在线二区| 欧美日韩电影一区二区三区| 国产伦精品一区二区三区在线播放 | 国产视频一区二区三区在线观看 | 麻豆一区二区麻豆免费观看| 亚洲最大的av网站| 日韩成人在线一区| 国产精品老女人视频| 人人视频精品| 欧美孕妇性xx| 乡村艳史在线观看| 98精品在线视频| a级片免费在线观看| 欧美黑人性视频| 在线中文字幕第一页| 北条麻妃在线一区二区| 在线免费av电影| 曰本色欧美视频在线| 久久这里精品| 日韩的一区二区| 五月天婷婷视频| 亚洲国产精品999| 丰满肉肉bbwwbbww| 亚洲高清在线观看| 天堂在线资源库| 亚洲精品久久久久中文字幕二区| 乱精品一区字幕二区| 精品国产1区2区3区| 不卡视频免费在线观看| 欧美不卡视频一区| 日本免费网站在线观看| 亚洲成av人片在线观看香蕉| 国精产品一品二品国精品69xx| 精品剧情v国产在线观看在线| 亚洲福利在线观看视频| 精品国产免费视频| 三区在线观看| 亚洲网站在线观看| 亚洲欧美视频一区二区| 久久亚洲精品一区二区| 久久不射影院| 2019中文字幕在线观看| 亚洲综合在线电影| 国产欧美一区二区白浆黑人| 美女精品久久| 国产日韩亚洲精品| 变态另类ts人妖一区二区| 色综合久久中文| 日本精品二区| 99热国内精品| 国产一级大片免费看| 国产精品入口66mio| 一本久道中文无码字幕av| 久久www免费人成看片高清| 国产高清av片| 99精品一区二区| 在线免费观看视频| 亚洲免费观看高清在线观看| 日韩少妇高潮抽搐| 欧美综合一区二区| 99草在线视频| 亚洲精品永久免费精品| 秋霞午夜在线观看| 久久久久久久久久久久av| 免费观看欧美大片| 成人啪啪免费看| 美腿丝袜亚洲图片| 亚洲一区二区三区四区中文| 亚洲特级毛片| wwww.国产| 成人高清视频在线| 男人天堂资源网| 午夜精品久久一牛影视| 中文字幕 视频一区| 精品国精品国产尤物美女| 成年人在线观看视频| 欧美激情久久久| 免费成人毛片| 久热这里只精品99re8久| 亚欧美无遮挡hd高清在线视频 | 国产一线二线在线观看 | 精品一级视频| 欧美在线一区二区三区四区| 欧美三级小说| 色国产在线视频| av中文字幕在线不卡| 免费高清在线观看电视| 91官网在线免费观看| av中文字幕免费| 在线视频日韩精品| 性欧美18xxxhd| 99理论电影网| 色喇叭免费久久综合网| 中国丰满人妻videoshd | 中文字幕av久久爽一区| 亚洲国产一区二区在线播放| 亚洲综合精品国产一区二区三区 | 91偷拍精品一区二区三区| 欧美一级本道电影免费专区| 少妇人妻在线视频| 国产成人在线网站| 可以免费看av的网址| 欧美自拍偷拍午夜视频| 色视频免费在线观看| 午夜伦理精品一区| 91亚洲精品视频在线观看| 中文字幕精品—区二区日日骚| 久久综合影音| 大又大又粗又硬又爽少妇毛片 | 欧美肥婆姓交大片| 亚洲一区有码| 亚洲欧洲一二三| 日本成人在线不卡视频| 加勒比综合在线| 黑人巨大精品欧美一区免费视频| 国产成人精品a视频| 久久久国产一区二区三区| 国产人妖一区| 一区二区日本| 久久激五月天综合精品| 三级黄色片在线观看| 欧美日韩精品一区二区三区四区| 国产精品毛片一区二区三区四区| 日韩暖暖在线视频| 国产成人调教视频在线观看| 成熟老妇女视频| 337p粉嫩大胆噜噜噜噜噜91av| 最新中文字幕一区| 亚洲欧美国产精品久久久久久久| 成人片免费看| 日本一区视频在线观看| 日韩国产欧美视频| 国产三级黄色片| 91精品国产综合久久久久久| gogogogo高清视频在线| 97超级碰碰| 日韩一区二区久久| 妺妺窝人体色WWW精品| 在线观看日韩高清av| 午夜在线播放| 99热在线播放| 日韩午夜在线电影| 国产交换配乱淫视频免费| 欧美三级日韩在线| 国产剧情在线| 国产精品视频500部| 久久国产99| 青青青视频在线免费观看| 欧美一区午夜精品| www成人免费观看| 欧美亚洲另类在线一区二区三区| 日韩二区三区四区| 国语对白在线播放| 亚洲第一在线视频| 亚洲日本网址| 久久久久久久久影视| 97se亚洲国产综合自在线 | 绿色成人影院| 日韩成人av网站| 国产一区二区三区在线看麻豆| 日韩精品一区二区三| 在线电影欧美日韩一区二区私密| 日本精品一区二区三区在线观看视频| 日本一区午夜艳熟免费| 久久久99精品免费观看不卡| 国产偷拍一区二区| 青草成人免费视频| 亚洲精品小说| 青青草视频成人| 3d成人动漫网站| 人狥杂交一区欧美二区| 国产成人精品免费看在线播放| 成人免费毛片aaaaa**| 一区二区视频免费| 国内精品久久久久久影视8| 日本在线电影一区二区三区| 国产a级黄色片| 在线播放91灌醉迷j高跟美女| 日本不卡网站| 菠萝蜜视频在线观看入口| 国产亚洲污的网站|