Memento 備忘錄模式
備忘錄模式:
在不破壞封裝的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態,
這樣可以在以後將對象恢復到原先保存的狀態。它是一種對象行爲型模式,其別名爲Token。結構圖:
示例類圖:
示例代碼:
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();
}
}
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
public class CareTaker {
private List<Memento> mementos = new ArrayList<Memento>();
public void add(Memento state) {
mementos.add(state);
}
public Memento get(int index) {
return mementos.get(index);
}
}
// 測試
public class MementoTest {
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());
}
}
角色:
Originator(原發器):
它是一個普通類,可以創建一個備忘錄,並存儲它的當前內部狀態,也可以使用備忘錄來恢復其內部狀態,一般將需要保存內部狀態的類設計爲原發器。Memento(備忘錄):
存儲原發器的內部狀態,根據原發器來決定保存哪些內部狀態。備忘錄的設計一般可以參考原發器的設計,
根據實際需要確定備忘錄類中的屬性。需要注意的是,除了原發器本身與負責人類之外,
備忘錄對象不能直接供其他類使用,原發器的設計在不同的編程語言中實現機制會有所不同。Caretaker(負責人):
負責人又稱爲管理者,它負責保存備忘錄,但是不能對備忘錄的內容進行操作或檢查。
在負責人類中可以存儲一個或多個備忘錄對象,它只負責存儲對象,而不能修改對象,也無須知道對象的實現細節。
備忘錄模式提供了一種狀態恢復的實現機制,使得用戶可以方便地回到一個特定的歷史步驟,
當新的狀態無效或者存在問題時,可以使用存儲起來的備忘錄將狀態復原,
當前很多軟件都提供了Undo(撤銷)操作功能,就使用了備忘錄模式。