備忘錄模式(Memento Pattern)保存一個對象的某個狀態,以便在適當的時候恢復對象。備忘錄模式屬于行為型模式。
關鍵代碼:客戶不與備忘錄類耦合,與備忘錄管理類耦合。
優點: 1、給用戶提供了一種可以恢復狀態的機制,可以使用戶能夠比較方便地回到某個歷史的狀態。 2、實現了信息的封裝,使得用戶不需要關心狀態的保存細節。
缺點:消耗資源。如果類的成員變量過多,勢必會占用比較大的資源,而且每一次保存都會消耗一定的內存。
注意事項: 1、為了符合迪米特原則,還要增加一個管理備忘錄的類。 2、為了節約內存,可使用原型模式+備忘錄模式。
- 創建 Memento 類。
/**
* 1. 創建Memento類。
* @author mazaiting
*
*/
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
- 創建 Originator 類。
/**
* 2. 創建 Originator 類。
* @author mazaiting
*/
public class Originator {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public Memento saveStateToMemento(){
return new Memento(state);
}
public void getStateFromMemento(Memento memento){
state = memento.getState();
}
}
- 創建 CareTaker 類。
/**
* 3. 創建 CareTaker 類。
* @author mazaiting
*/
public class CareTaker {
private List<Memento> mementos = new ArrayList<Memento>();
/**
* 添加
*/
public void add(Memento memento) {
mementos.add(memento);
}
/**
* 獲取Memento
*/
public Memento get(int index){
return mementos.get(index);
}
}
- 使用 CareTaker 和 Originator 對象。
/**
* 4. 使用 CareTaker 和 Originator 對象。
* @author mazaiting
*
*/
public class Client {
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());
}
}
- 打印結果
Current State: State #4
First saved State: State #2
Second saved State: State #3