備忘錄(Memento):在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原來保存的狀態。
備忘錄模式結構圖
Memento(備忘錄):負責存儲Originator對象的內部狀態,防止Originator以外的其他對象訪問備忘錄Memento。備忘錄有兩個接口,Caretaker只能看到窄接口,它只能將備忘錄傳遞給其他對象。Originator能夠看到一個寬接口,允許它訪問返回到先前狀態所需的所有數據。
使用場景:
- Memento模式比較適用于功能比較復雜的,但需要維護或記錄屬性歷史的類。
- 如果在某個系統中使用命令模式時,需要實現命令的撤銷功能,那么命令模式可以使用備忘錄模式來存儲可撤銷操作的狀態。
- 角色狀態改變時,如果先狀態無效,那么可以使用備忘錄模式將這個狀態恢復。
package com.memento;
public class Original {
//這個類的一些狀態需要保存
private String value;
public Original(String value) {
this.value = value;
}
public Memento createMemento(){
return new Memento(value);
}
public void restoreMemento(Memento m){
this.value = m.getValue();
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
package com.memento;
public class Memento {
//一個備忘錄對象
private String value;
public Memento(String value){
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
package com.memento;
public class Storage {
//存儲備忘錄對象
private Memento memento;
public Storage(Memento memento) {
super();
this.memento = memento;
}
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
package com.memento;
/**
* ClassName: Main
* @Description:備忘錄模式(Memento):
* 主要目的是保存一個對象的某個狀態,以便在適當的時候恢復對象,個人覺得叫備份模式更形象些,
* Original類是原始類,里面有需要保存的屬性value及創建一個備忘錄類,用來保存value值。
* Memento類是備忘錄類,Storage類是存儲備忘錄的類,持有Memento類的實例,該模式很好理解。
* @author Panyk
* @date 2015年10月15日
*/
public class Main {
public static void main(String[] args) {
//創建原始類
Original o = new Original("egg");
//創建備忘錄
Storage s = new Storage(o.createMemento());
//修改原始類值
System.out.println("原始值="+o.getValue());
o.setValue("new value");
System.out.println("更新值="+o.getValue());
//恢復原始值
o.restoreMemento(s.getMemento());
System.out.println("恢復值=" + o.getValue());
}
}