java 行為模式 備忘錄模式
阿新 • • 發佈:2019-02-12
意圖
在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態
適用性
必須儲存一個物件在某一個時刻的(部分)狀態, 這樣以後需要時它才能恢復到先前的狀態。
備忘錄模式的構成
1 備忘錄(Memento)角色:保持原發器(Originator)的內部狀態,根據原發器來決定儲存哪些內部的狀態。
備忘錄可以有效地利用兩個介面。看管者只能呼叫狹窄(功能有限)的介面——它只能傳遞備忘錄給其他物件。而原發器可以呼叫一個寬闊(功能強大)的介面,通過這個介面可以訪問所有需要的資料,使原發器可以返回先前的狀態。
2 原發器(Originator)角色:建立一個備忘錄,記錄它的當前內部狀態。可以利用一個備忘錄來恢復它的內部狀態
3 看管者(Caretaker)角色:只負責看管備忘錄。不可以對備忘錄的內容操作或者檢查
備忘錄角色
package Memento; /** * 備忘錄 */ public class Memento { private String name; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public Memento(String age, String name){ this.name=name; this.age = age; } }
原發器角色
package Memento; public class Originator { private String name; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return String.format("name:%s age:%s", name, age); } /** * @param age * @param name * @return */ public Memento createMemento(String age,String name){ return new Memento(age,name); } public void restoreMemento(Memento memento){ this.name = memento.getName(); this.age = memento.getAge(); } }
看管者
package Memento;
public class Caretaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
測試
package Memento;
public class Client {
public static void main(String[] args) {
Originator or = new Originator();
or.setAge("12");
or.setName("liming");
System.out.println(or.toString());
Caretaker c = new Caretaker();
Memento me = or.createMemento(or.getAge(),or.getName());
c.setMemento(me);
or.setName("lilei");
or.setAge("23");
System.out.println(or.toString());
System.out.println("-----------restore");
or.restoreMemento(c.getMemento());
System.out.println(or.toString());
}
}
列印結果name:liming age:12
name:lilei age:23
-----------restore
name:liming age:12