備忘錄(Memento)模式又稱標記(Token)模式。GOF給備忘錄模式的定義爲:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態。
/**
* 發起人角色
*/
public class Originator {
private String state;
/**
* 工廠方法返回一個新備忘錄對象
*/
public MementoIF createMemento() {
return new Memento(this.state);
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
System.out.println("Current state is " + this.state);
}
/**
* 將發起人恢復到備忘錄對象記錄的狀態
*/
public void restoreMemento(MementoIF memento) {
Memento aMemento = (Memento) memento;
this.setState(aMemento.getSavedState());
}
/**
* 內部成員類,備忘錄
*/
protected class Memento implements MementoIF {
private String savedState;
public Memento(String someState) {
this.savedState = someState;
}
public String getSavedState() {
return savedState;
}
public void setSavedState(String savedState) {
this.savedState = savedState;
}
}
}
public interface MementoIF {
}
/**
* 負責人角色
*/
public class Caretaker {
private MementoIF memento;
/**
* 備忘錄的取值方法
*/
public MementoIF retrieveMemento() {
return this.memento;
}
/**
* 備忘錄的賦值方法
*/
public void saveMemento(MementoIF memento) {
this.memento = memento;
}
}
public class Client {
//發起人
private static Originator originator = new Originator();
//負責人
private static Caretaker caretaker = new Caretaker();
public static void main(String[] args) {
//設置發起人對象狀態
originator.setState("ON");
//創建備忘錄對象將這個對象存儲起來
caretaker.saveMemento(originator.createMemento());
//改變發起人對象狀態
originator.setState("OFF");
//恢復發起人對象狀態
originator.restoreMemento(caretaker.retrieveMemento());
}
}