備忘錄模式(Memento),再不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)。
適用場景
- Memento模式比較適用于功能比較復(fù)雜的,但需要維護(hù)或記錄屬性歷史的類,或者需要保存的屬性只是眾多屬性中的一小部分是,Originator可以根據(jù)保存的Memento信息還原到前一狀態(tài)。
- 如果某個系統(tǒng)中使用命令模式時,需要實(shí)現(xiàn)命令的撤銷功能,那么命令模式可以使用備忘錄模式來存儲可撤銷的狀態(tài)。
- 當(dāng)角色的狀態(tài)改變的時候,有可能這個狀態(tài)無效,這時候就可以使用暫時存儲起來的備忘錄將狀態(tài)復(fù)原。
優(yōu)點(diǎn)
要保存的細(xì)節(jié)封裝在了Memento中,如果需要修改保存的細(xì)節(jié),這個時候不會影響客戶端。
缺點(diǎn)
角色狀態(tài)需要完整存儲到備忘錄對象中,如果狀態(tài)數(shù)據(jù)很大很多,那么在資源消耗上,備忘錄對象會非常耗內(nèi)存。
UML結(jié)構(gòu)圖

MementoPattern
源碼
Memento:備忘錄類
/**
* 備忘錄類
*
* Created by zhenguo on 11/30/14.
*/
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
Originator:發(fā)起人
/**
* 發(fā)起人
*
* Created by zhenguo on 11/30/14.
*/
public class Originator {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public void setMemento(Memento memento) {
state = memento.getState();
}
public Memento createMemento() {
return new Memento(state);
}
public void show() {
System.out.println("Current State : " + state);
}
}
Caretaker:管理者類
/**
* 管理者類
*
* Created by zhenguo on 11/30/14.
*/
public class Caretaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
Client:客戶端調(diào)用
/**
* 客戶端調(diào)用
* 備忘錄模式(Memento),再不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。
* 這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)。
*
* Created by zhenguo on 11/30/14.
*/
public class Client {
public static void main(String[] args) {
Originator originator = new Originator();
originator.setState("On");
originator.show();
Caretaker caretaker = new Caretaker();
caretaker.setMemento(originator.createMemento());
originator.setState("Off");
originator.show();
originator.setMemento(caretaker.getMemento());
originator.show();
}
}
設(shè)計模式系列:
| 創(chuàng)建型 | 結(jié)構(gòu)型 | 行為型 |
|---|---|---|
|
工廠方法 簡單工廠 抽象工廠 建造者模式 單例模式 原型模式 |
組合模式 外觀模式 橋接模式 代理模式 享元模式 適配器模式 裝飾模式 |
策略模式 模板方法 狀態(tài)模式 觀察者模式 備忘錄模式 迭代器模式 命令模式 職責(zé)鏈模式 解釋器模式 訪問者模式 中介者模式 |