目錄
1. 概念
1.1、定義
1.2、適用場景
2、角色劃分
3、實現
1、Originator(發起人)
2、Memento(備忘錄)
3、Caretaker(管理者)
4、使用示例
4、優缺點
4.1、優點
4.2、缺點
前言
????????備忘錄模式是一種行為型設計模式,用于在不破壞封裝性的情況下保存和恢復對象的狀態。它包含源發器、備忘錄和管理者三個角色。
????????該模式常用于撤銷操作,如文本編輯器的撤銷功能和數據庫事務管理。
????????備忘錄模式雖然有內存占用和性能開銷的缺點,但在需要狀態管理的場景中十分有用。
設計模式分類如下:
1. 概念
1.1、定義
????????備忘錄模式(Memento Pattern))用于在不破壞對象封裝性的前提下,捕獲一個對象的內部狀態,并在需要時恢復這個狀態(如撤銷操作)。
????????即允許對象把當前狀態保存到外部對象中。以后可將其恢復。
1.2、適用場景
1、需要保存和恢復數據場景(如撤銷、歷史快照、存檔、游戲進度、表單編輯器等)。
2、不希望外部對象隨意訪問對象內部細節,但需要保存和恢復快照。
2、角色劃分
如下圖所示:
- Originator(發起人/原發器):擁有內部狀態,需要保存和恢復
- Memento(備忘錄):保存Originator的狀態
- Caretaker(管理者/看護者):保存并管理備忘錄,但不能操作備忘錄內部實現內容
3、實現
1、Originator(發起人)
class Editor {private String text;public void setText(String text) { this.text = text; }public String getText() { return text; }public Memento save() { return new Memento(text); }public void restore(Memento m) { this.text = m.getText(); }
}
2、Memento(備忘錄)
class Memento {private final String text;public Memento(String text) { this.text = text; }public String getText() { return text; }
}
3、Caretaker(管理者)
import java.util.Stack;
class Caretaker {private Stack<Memento> history = new Stack<>();public void add(Memento m) { history.push(m); }public Memento undo() {if (!history.isEmpty()) return history.pop();return null;}
}
4、使用示例
public class Main {public static void main(String[] args) {Editor editor = new Editor();Caretaker caretaker = new Caretaker();editor.setText("第一版");caretaker.add(editor.save());editor.setText("第二版");caretaker.add(editor.save());editor.setText("第三版");// 撤銷到第二版editor.restore(caretaker.undo());System.out.println(editor.getText()); // 輸出 第二版// 再撤銷editor.restore(caretaker.undo());System.out.println(editor.getText()); // 輸出 第一版}
}
4、優缺點
4.1、優點
1、狀態保存與恢復:
????????備忘錄模式可以幫助我們保存對象的狀態,并在需要時恢復到之前的狀態。這在某些情況下非常有用,比如撤銷操作或者程序崩潰后的恢復。
2、封裝性和隔離性:
????????可以確保對象的狀態保存在備忘錄對象中,而不會暴露給其他對象。這為對象的封裝性和隔離性提供了保護,使得對象的狀態變化對其他對象是透明的。
4.2、缺點
1、內存占用:
????????可能引起較大的內存占用,特別是當對象的狀態較多且狀態改變頻繁時。每個備忘錄對象都需要保存一份完整的狀態,如果狀態較多或者備忘錄對象較多,可能會消耗大量內存。
2、性能開銷:
????????備忘錄模式涉及到創建、存儲和恢復狀態的操作,這些操作可能引起一定的性能開銷。特別是在狀態較大或者對象較復雜的情況下,備忘錄模式的性能可能會受到影響。
總結:
參考文章:
1、設計模式(十九)行為型:備忘錄模式詳解-CSDN博客文章瀏覽閱讀443次,點贊19次,收藏21次。備忘錄模式(Memento Pattern)是 GoF 23 種設計模式中的行為型模式之一,其核心價值在于在不破壞封裝性的前提下,捕獲并外部化一個對象的內部狀態,以便在之后能夠將該對象恢復到原先保存的狀態。https://blog.csdn.net/ZxqSoftWare/article/details/149712206?ops_request_misc=%257B%2522request%255Fid%2522%253A%252299945c753ba5cd13ba1abf9c2213f646%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=99945c753ba5cd13ba1abf9c2213f646&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-149712206-null-null.142^v102^control&utm_term=%E5%A4%87%E5%BF%98%E5%BD%95%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187