基本概念
备忘录模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到之前保存的状态。
结构图
上图摘自《大话设计模式》
应用场景
备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分,原始对象可以根据保存的备忘录信息恢复到原来的某个状态。
源码示例
1.创建一个备忘录类
package com.spook.memento;
/**
* 备忘录类
*/
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
2.创建一个发起者类
package com.spook.memento;
/**
* 发起者类
*/
public class Originator {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
/**
* 将状态保存到备忘录
*
* @param state
* @return
*/
public Memento createMemento(String state) {
return new Memento(state);
}
/**
* 从备忘录中读取状态
*
* @param memento
* @return
*/
public void getStateFromMemento(Memento memento) {
this.state = memento.getState();
}
}
3.创建一个备忘管理类
package com.spook.memento;
import java.util.ArrayList;
import java.util.List;
/**
* 备忘管理类
*/
public class CareTaker {
private List<Memento> mementoList = new ArrayList<Memento>();
public void add(Memento m) {
mementoList.add(m);
}
public Memento getMemento(int index) {
return mementoList.get(index);
}
}
4.测试类
package com.spook.memento;
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
Originator originator = new Originator();
CareTaker careTaker = new CareTaker();
careTaker.add(originator.createMemento("状态1"));
careTaker.add(originator.createMemento("状态2"));
System.out.println("经过一段时间后,想取出之前保存的状态");
originator.getStateFromMemento(careTaker.getMemento(0));
System.out.println(originator.getState());
originator.getStateFromMemento(careTaker.getMemento(1));
System.out.println(originator.getState());
}
}
运行测试类输出如下内容:
经过一段时间后,想取出之前保存的状态
状态1
状态2