定義(百度百科): 在不破壞封閉的前提下,捕獲一個對象的內部狀態,併在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態。 UML類圖: 具體代碼: 各模塊說明:Memento:備忘錄,存儲Originator的對象狀態,存儲哪些應該由Originator決定。Originator:原 ...
定義(百度百科):
在不破壞封閉的前提下,捕獲一個對象的內部狀態,併在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態。
UML類圖:
具體代碼:
public class Originator { private String state; public Memento createMemento() { return new Memento(this); } public void restoreMemento(Memento m) { state = m.getState(); } public void setState(String state) { this.state=state; } public String getState() { return this.state; } } public class Memento { private String state; public Memento(Originator o) { state = o.getState(); } public void setState(String state) { this.state=state; } public String getState() { return this.state; } } public class Caretaker { private Memento memento; public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento=memento; } } public class Client { public static void main(String[] args) { Originator originator = new Originator(); originator.setState("123"); Memento memento = new Memento(originator); originator.setState("456"); Caretaker caretaker = new Caretaker(); caretaker.setMemento(memento); System.out.println(originator.getState()); originator.restoreMemento(caretaker.getMemento()); System.out.println(originator.getState()); } } 456 123
各模塊說明:
Memento:備忘錄,存儲Originator的對象狀態,存儲哪些應該由Originator決定。
Originator:原發器,使用備忘錄保存某一時刻的狀態,也可以使用備忘錄恢復某一時刻狀態。
Caretaker:備忘錄管理者,保存備忘錄內容,但不能改變和查看備忘錄狀態。
適應場景:
保存一個對象在某一個時刻的全部狀態或部分狀態,實現撤銷操作。
防止外界對象破壞一個對象歷史狀態的封裝性,避免將對象歷史狀態的實現細節暴露給外界對象。
優缺點:
優點:
更好的封裝性
簡化原發器
缺點:
可能導致高開銷(頻繁訪問和創建備忘錄)
總結:
保存和恢複原發器內部狀態。