精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲激情图片qvod| 国产欧美日韩一级| 日韩午夜三级在线| www国产黄色| 在线免费观看黄色| 懂色av噜噜一区二区三区av| 日本乱人伦a精品| 亚洲欧美精品久久| 国产精品videossex| 欧美性猛交xxxx乱大交蜜桃| 一级特黄录像免费播放全99| 可以免费观看的毛片| 久久国产日本精品| 欧美日韩不卡合集视频| 能免费看av的网站| 亚洲乱码一区| 欧美午夜精品电影| 久操网在线观看| 欧美jizz18性欧美| 久久综合九色综合97婷婷| 国产日韩欧美另类| 欧美精品一二三四区| 午夜日韩福利| 在线观看日韩欧美| 国产麻豆天美果冻无码视频| 国产精久久久| 欧美视频一区二| 国产97在线 | 亚洲| 国产精品实拍| 国产欧美日韩中文久久| 国语精品中文字幕| www.黄色小说.com| 另类中文字幕网| 国产成人精品综合久久久| 国产午夜视频在线播放| 先锋资源久久| 中文字幕在线观看日韩| 亚洲区自拍偷拍| 欧美成a人免费观看久久| 日韩欧美一二三四区| 九一精品久久久| 精品九九久久| 欧美日韩小视频| 最近中文字幕一区二区| 忘忧草在线日韩www影院| 亚洲高清中文字幕| 人妻激情另类乱人伦人妻| 精品自拍一区| 亚洲欧美自拍偷拍| 最新欧美日韩亚洲| 麻豆免费在线视频| 亚洲欧美偷拍卡通变态| 樱空桃在线播放| 国产盗摄在线观看| 18成人在线观看| 中文字幕欧美人与畜| 午夜免费视频在线国产| 国产精品色呦呦| 中文字幕乱码一区二区三区| 美女隐私在线观看| 亚洲欧美日韩国产一区二区三区| 国产精品无码乱伦| 高清免费电影在线观看| 亚洲欧美日韩系列| 成人一级生活片| 9lporm自拍视频区在线| 欧美性猛交xxxx免费看久久久| 欧美污视频网站| 韩国三级一区| 欧美精品一卡二卡| 天堂va欧美va亚洲va老司机| 国产精品色在线网站| 亚洲精品国精品久久99热一| 泷泽萝拉在线播放| 日韩成人精品一区| 乱亲女秽乱长久久久| 久久久久久激情| 亚洲综合好骚| 国产噜噜噜噜久久久久久久久| 国产精品高潮呻吟AV无码| 国产成人免费视频网站高清观看视频| caoporen国产精品| 日韩一二三四| 亚洲天堂2014| a在线视频观看| 国产a亚洲精品| 精品对白一区国产伦| 亚洲自拍偷拍一区二区| 99久久www免费| 韩国福利视频一区| 超碰在线免费97| 国产传媒久久文化传媒| 另类欧美小说| av在线app| 日韩欧美国产激情| 欧洲在线免费视频| 美女精品一区最新中文字幕一区二区三区 | 不卡的av中国片| 免费国产在线精品一区二区三区| 欧美激情二区| 欧美网站在线观看| 午夜诱惑痒痒网| 深爱激情久久| 欧美激情第1页| 中国一级特黄视频| 不卡av免费在线观看| 亚洲黄色成人久久久| 国产精品偷拍| 69久久夜色精品国产69蝌蚪网| 成人性生活免费看| 亚洲最新色图| 国产精品你懂得| 偷拍精品一区二区三区| 综合久久久久久| 国产成人久久777777| julia中文字幕一区二区99在线| 色小说视频一区| av网站中文字幕| 国产成人丝袜美腿| 欧洲美女和动交zoz0z| 韩国成人在线| 亚洲欧洲高清在线| 国产无遮挡又黄又爽在线观看| 激情综合色播五月| 一区二区三区久久网| 亚洲成av在线| 亚洲色图在线观看| 久久久久久久久影院| 顶级嫩模精品视频在线看| 这里只有精品66| 成人在线视频观看| 国产亚洲精品久久久久久777| 国产午夜久久久| 国产成人精品免费在线| 好吊色这里只有精品| 欧美videos粗暴| 中文字幕成人精品久久不卡| 色一情一乱一伦| 久久亚洲免费视频| 国产综合免费视频| 伊人成综合网伊人222| 97精品久久久| 日韩porn| 色综合一区二区三区| 菠萝菠萝蜜网站| 国产精品久久777777毛茸茸 | 高h震动喷水双性1v1| 亚洲精品免费看| 国产成人av免费观看| 亚洲情侣在线| 99热在线国产| 国产v日韩v欧美v| 日韩成人在线视频观看| 亚洲天堂av片| 国产日韩欧美精品在线| 一区二区成人网| 香港欧美日韩三级黄色一级电影网站| 成人在线激情视频| 男女在线观看视频| 日韩久久精品成人| 欧美brazzers| 成人欧美一区二区三区小说| 欧美xxxxxbbbbb| 激情综合激情| 欧美在线3区| 99久久伊人| 欧美xxxx做受欧美| 蜜臀av午夜精品| 色综合久久久久综合| 少妇av片在线观看| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品无码免费专区午夜| 精品av导航| 国产成人精品免费久久久久 | 红桃视频 国产| 亚洲小说区图片区| 蜜桃在线一区二区三区精品| 国产极品久久久久久久久波多结野| 日韩在线观看av| 亚洲免费黄色片| 色欧美乱欧美15图片| 午夜黄色福利视频| 成人丝袜18视频在线观看| 日批视频在线免费看| 久久婷婷蜜乳一本欲蜜臀| 99re视频在线播放| 男人最爱成人网| 不用播放器成人网| 飘雪影院手机免费高清版在线观看| 欧美三级欧美一级| 国产成人精品av久久| 国产亚洲精品精华液| 麻豆传媒在线看| 丝袜亚洲另类丝袜在线| 日韩视频一二三| 久久av超碰| 91在线观看网站| 国产精品久久久久av电视剧| 欧美裸身视频免费观看| 成人好色电影| 日韩大片免费观看视频播放| 国产精品国产一区二区三区四区 | 国产精品第一页在线| 97影院秋霞午夜在线观看| 亚洲精品久久久久中文字幕欢迎你| 中文精品久久久久人妻不卡| 一区二区免费在线| 国产精品视频看看| xfplay精品久久| 国产在线a视频| 久久精品免费观看| 成年人视频网站免费观看| 亚洲综合小说| 色播亚洲视频在线观看| 欧美调教视频| 波多野结衣久草一区| 欧美xxxx做受欧美护士| 国内精品久久久久久久| 国产在线激情视频| 怡红院精品视频| 你懂的免费在线观看| 精品国产乱码久久久久久影片| 11024精品一区二区三区日韩| 欧美性猛交xxxx偷拍洗澡| 日本在线视频免费| 亚洲一区国产视频| 男人的天堂久久久| 亚洲欧洲一区二区三区| 极品蜜桃臀肥臀-x88av| 91色在线porny| 国产 中文 字幕 日韩 在线| 国产sm精品调教视频网站| 午夜福利123| 国产在线国偷精品免费看| 五月婷婷激情久久| 日本不卡123| 91在线视频观看免费| 久久午夜影视| 成人羞羞国产免费网站| 麻豆成人在线| 国产av人人夜夜澡人人爽| 米奇777在线欧美播放| 久草资源站在线观看| 99热免费精品在线观看| 国产3p露脸普通话对白| 99精品免费| 337p粉嫩大胆噜噜噜鲁| 国产精品社区| wwwxxx黄色片| 日本三级亚洲精品| 久热精品在线播放| 国产一区欧美二区| 成人在线短视频| 国产不卡在线视频| 国产精品入口麻豆| 99国产精品99久久久久久| 亚洲国产综合视频| 久久看人人爽人人| 蜜桃久久精品成人无码av| 中文幕一区二区三区久久蜜桃| 精品一区二区在线观看视频| 亚洲人成小说网站色在线| 69av视频在线| 欧美日韩在线观看视频| 亚洲 日本 欧美 中文幕| 欧美性欧美巨大黑白大战| 这里只有精品9| 欧美一级生活片| 午夜视频福利在线观看| 亚洲最新视频在线| 国产三级在线播放| 午夜精品一区二区三区在线播放| 中文字幕在线视频久| 国产色综合天天综合网| 亚洲精品黑牛一区二区三区| 狠狠久久综合婷婷不卡| 国产精品一区二区三区av麻| 超碰免费在线公开| 国产日韩一区二区三区在线播放| 日本男人操女人| 国产福利一区二区| 日本丰满少妇裸体自慰| 国产精品不卡在线| 国产极品在线播放| 欧美日韩中字一区| 欧美性猛交 xxxx| 中国china体内裑精亚洲片| 成人短视频在线观看| 97超碰国产精品女人人人爽| 成人久久网站| 国产精品美女xx| 精品国产一区二区三区久久久蜜臀| 一本—道久久a久久精品蜜桃| 在线精品在线| 欧美在线aaa| 97精品超碰一区二区三区| 日韩福利在线视频| 亚洲妇女屁股眼交7| 中文字幕在线视频第一页| 亚洲国产精久久久久久| 久久久久久国产精品免费无遮挡 | 国产高清www| 麻豆精品久久久| 国产麻豆天美果冻无码视频| 亚洲猫色日本管| 中文字幕一区二区免费| 亚洲精品久久久久中文字幕二区| 操你啦视频在线| 国产精品美女在线| 亚洲免费专区| 成年人深夜视频| 国产一区二区在线看| 男人的天堂av网| 一本大道久久a久久精二百| 亚洲经典一区二区| 久久影院模特热| 韩国理伦片久久电影网| 欧美日韩在线一区二区三区| 亚洲先锋成人| 特级西西444www| 欧美国产在线观看| www.色国产| 亚洲男人天堂2019| 麻豆免费在线| 国产伦精品一区二区三区免费视频| 亚洲一区二区三区| 在线看免费毛片| 国产精品九色蝌蚪自拍| 日韩欧美国产另类| 亚洲欧洲免费视频| 成人欧美一区二区三区的电影| 国产在线一区二区三区欧美| 欧美aa国产视频| www激情五月| 亚洲欧美精品午睡沙发| 国产亲伦免费视频播放| 中文字幕亚洲图片| 91亚洲精品| 婷婷亚洲婷婷综合色香五月| 久久精品主播| av黄色在线免费观看| 日本道精品一区二区三区| 美丽的姑娘在线观看免费动漫| 91av视频导航| 伊人精品一区| 久久久久国产精品熟女影院| 国产亚洲污的网站| 中文字幕在线观看精品| 日韩在线视频网站| 国产一区二区三区视频在线| 美女黄色片网站| 国产成人免费高清| 日本一区二区三区四区五区| 亚洲精品国产精品国产自| 超碰激情在线| 日本一区不卡| 久久99久国产精品黄毛片色诱| 婷婷国产成人精品视频| 欧美一级高清片| 国产不卡123| 日本视频一区二区在线观看| 日韩精品成人一区二区在线| 阿v天堂2014| 日韩视频在线你懂得| 91福利在线尤物| 欧美亚洲另类在线一区二区三区| 日本欧美加勒比视频| 神马久久精品综合| 精品久久五月天| 亚洲国产福利| 亚洲一区二区三区精品在线观看 | 你懂得在线视频| 91精品办公室少妇高潮对白| 亚洲xxxxxx| 国产传媒欧美日韩| 久热精品视频| www.av视频| 国产视频在线观看一区二区| 亚洲爱爱视频| 日本免费a视频| 欧美韩国一区二区| 亚洲爆乳无码一区二区三区| 日本国产一区二区三区| 99精品综合| av无码一区二区三区| 欧美日韩国产综合草草| 国产一线二线在线观看| 欧洲一区二区日韩在线视频观看免费| 捆绑变态av一区二区三区| 久久久精品视频免费| 中文字幕亚洲一区| 女同一区二区三区| 亚洲一区二区福利视频| 欧美日韩国产一区在线| 久久综合之合合综合久久| 欧美极品一区| 岛国一区二区在线观看| 日本成人一级片| 538国产精品视频一区二区| 久久久久久久久99精品大|