定義
在不破壞封裝的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態,這樣可以在以後將對象恢復到原先保存的狀態。它是一種對象行爲型模式,其別名爲Token。
UML類圖
代碼實現
Originator.java
public class Originator {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public Memento createMemento() {
return new Memento(state);
}
public void restore(Memento memento) {
state = memento.getState();
}
}
Memento.java
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
Caretaker.java
public class Caretaker {
private Memento memento;
public void setMemento(Memento memento) {
this.memento = memento;
}
public Memento getMemento() {
return memento;
}
}
Main.java
Caretaker caretaker = new Caretaker();
Originator originator = new Originator();
originator.setState("A");
Memento memento = originator.createMemento();
caretaker.setMemento(memento);
System.out.println("Originator save state:"+originator.getState());
originator.setState("B");
System.out.println("Originator changed state:"+originator.getState());
originator.restore(caretaker.getMemento());
System.out.println("Originator restore state:"+originator.getState());
打印的結果:
Originator save state:A
Originator changed state:B
Originator restore state:A
優缺點
主要優點
-
它提供了一種狀態恢復的實現機制,使得用戶可以方便地回到一個特定的歷史步驟,當新的狀態無效或者存在問題時,可以使用暫時存儲起來的備忘錄將狀態復原。
-
備忘錄實現了對信息的封裝,一個備忘錄對象是一種原發器對象狀態的表示,不會被其他代碼所改動。備忘錄保存了原發器的狀態,採用列表、堆棧等集合來存儲備忘錄對象可以實現多次撤銷操作。
主要缺點
- 資源消耗過大,如果需要保存的原發器類的成員變量太多,就不可避免需要佔用大量的存儲空間,每保存一次對象的狀態都需要消耗一定的系統資源。