意圖:在不破壞對象封裝性的前提下,在對象的外部得到並保存對象內部的狀態,這樣對象以後還能恢復到原來的狀態。像是備份對象的內部信息。
參與者:
memento(備忘錄),存儲原發器的內部狀態。
Originator(原發器),創建備忘錄,紀錄自己當前的狀態,以及使用備忘錄恢復對象的狀態。
CareTaker(負責人),負責保存好備忘錄,並且保護備忘錄不能被改變。
缺點:使用備忘錄的代價很高,如果原發器創建備忘錄時,必須拷貝並存儲大量數據,或者客戶端要頻繁的創建和恢復原發器的狀態,可能會導致很大的開銷。
Java代碼實現如下:
package com.zqwei.memento;
public class Originator {
private Memento memento;
private String name = null;
public Originator(String name) {
this.name = name;
}
public Memento createMemento() {
return new Memento(name);
}
public void restoreMemento(Memento memento) {
this.name = memento.getName();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Memento {
private String name;
public Memento(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class CareTaker {
private Memento memento;
public CareTaker(Memento memento) {
this.memento = memento;
}
public Memento getMemento(){
return memento;
}
}
public class Test {
public static void main(String[] args) {
Originator ori = new Originator("zhangsan");
CareTaker careTaker = new CareTaker(ori.createMemento());
System.out.println("before modify, name is "+ori.getName());
ori.setName("lisi");
System.out.println("after modify,name is "+ori.getName());
ori.restoreMemento(careTaker.getMemento());
System.out.println("after restore, name is"+ori.getName());
}
}