原文位址: http://www.work100.net/training/monolithic-architecture-design-patterns-memento-pattern.html 更多教程: 光束雲 - 免費課程
備忘錄模式
請參照如上
章節導航
進行閱讀
1.概述
備忘錄模式(
Memento Pattern
)儲存一個對象的某個狀态,以便在适當的時候恢複對象。備忘錄模式屬于行為型模式。
意圖:
在不破壞封裝性的前提下,捕獲一個對象的内部狀态,并在該對象之外儲存這個狀态。
主要解決:
所謂備忘錄模式就是在不破壞封裝的前提下,捕獲一個對象的内部狀态,并在該對象之外儲存這個狀态,這樣可以在以後将對象恢複到原先儲存的狀态。
何時使用:
很多時候我們總是需要記錄一個對象的内部狀态,這樣做的目的就是為了允許使用者取消不确定或者錯誤的操作,能夠恢複到他原先的狀态,使得他有"後悔藥"可吃。
如何解決:
通過一個備忘錄類專門存儲對象狀态。
關鍵代碼:
客戶不與備忘錄類耦合,與備忘錄管理類耦合。
應用執行個體:
- 後悔藥。
- 打遊戲時的存檔。
- Windows 裡的
+ctrl
。z
- IE 中的後退。
- 資料庫的事務管理。
優點:
- 給使用者提供了一種可以恢複狀态的機制,可以使使用者能夠比較友善地回到某個曆史的狀态。
- 實作了資訊的封裝,使得使用者不需要關心狀态的儲存細節。
缺點:
消耗資源。如果類的成員變量過多,勢必會占用比較大的資源,而且每一次儲存都會消耗一定的記憶體。
使用場景:
- 需要儲存/恢複資料的相關狀态場景。
- 提供一個可復原的操作。
注意事項:
- 為了符合迪米特原則,還要增加一個管理備忘錄的類。
- 為了節約記憶體,可使用原型模式+備忘錄模式。
2.實作
備忘錄模式使用三個類
Memento
、
Originator
和
CareTaker
Memento
包含了要被恢複的對象的狀态。
Originator
建立并在
Memento
對象中存儲狀态。
Caretaker
對象負責從
Memento
中恢複對象的狀态。
MementoPatternDemo
,我們的示範類使用
CareTaker
Originator
對象來顯示對象的狀态恢複。
步驟 1
建立
Memento
類。
Memento.java
,代碼如下:
public class Memento {
private String state;
public Memento(String state){
this.state = state;
}
public String getState(){
return state;
}
}
步驟 2
Originator
Originator.java
public class Originator {
private String state;
public void setState(String state){
this.state = state;
}
public String getState(){
return state;
}
public Memento saveStateToMemento(){
return new Memento(state);
}
public void getStateFromMemento(Memento Memento){
state = Memento.getState();
}
}
步驟 3
CareTaker
CareTaker.java
import java.util.ArrayList;
import java.util.List;
public class CareTaker {
private List<Memento> mementoList = new ArrayList<Memento>();
public void add(Memento state){
mementoList.add(state);
}
public Memento get(int index){
return mementoList.get(index);
}
}
步驟 4
使用
CareTaker
Originator
對象。
MementoPatternDemo.java
public class MementoPatternDemo {
public static void main(String[] args) {
Originator originator = new Originator();
CareTaker careTaker = new CareTaker();
originator.setState("State #1");
originator.setState("State #2");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #3");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #4");
System.out.println("Current State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(0));
System.out.println("First saved State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(1));
System.out.println("Second saved State: " + originator.getState());
}
}
步驟 5
執行程式,輸出結果:
Current State: State #4
First saved State: State #2
Second saved State: State #3
上一篇:
中介者模式下一篇:
觀察者模式如果對課程内容感興趣,可以掃碼關注我們的或
公衆号
,及時關注我們的課程更新
QQ群
