忘录模式是一种行为模式,主要用于保存和恢复对象在某个时刻的内部状态。
1、定义
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可以将该对象恢复到原先保存的状态。
2、使用场景
- 需要保存一个对象的在某个时刻的状态或部分状态
- 如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,这是可以通过中间对象间接访问其内部状态。
3、UML图
- Memento:备忘录,主要用来存储原发器的内部状态信息。它只能由原发器对象来访问它内部的数据。
- Originator:原发器,需要保存和恢复状态的对象。创建备忘录并用来保存某个时刻的自身状态信息。也可以使用备忘录来恢复自身的内部状态。
- Caretaker:备忘录管理者,主要负责保存备忘录对象,但是不能对备忘录的内容进行操作和访问。
4、示例代码
//备忘录
public class Memento {
private String state;
public Memento() {
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
//需要保存状态信息的原发器
public class Originator {
private String state;
/**
* 创建备忘录对象
*/
public Memento createMemento() {
Memento memento = new Memento();
memento.setState(state);
return memento;
}
/**
* 从备忘录对象中恢复数据
*/
public void restore(Memento memento) {
this.state = memento.getState();
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
//备忘录管理者,主要用来保存备忘录
public class Caretaker {
private Memento memento;
/**
* 获取备忘录
*/
public Memento restoreMemento() {
return this.memento;
}
/**
* 保存备忘录
*/
public void storeMemento(Memento memento) {
this.memento = memento;
}
}
客户端调用:
public class Client {
public static void main(String args[]) {
Originator o = new Originator();
Caretaker c = new Caretaker();
// 改变原发器对象的状态
o.setState("On");
System.out.println("初始状态:" + o.getState());
// 创建备忘录对象,并将原发器对象的状态储存起来
c.storeMemento(o.createMemento());
// 修改原发器的状态
o.setState("Off");
System.out.println("改变后的状态:" + o.getState());
// 恢复原发器对象的状态
o.restore(c.restoreMemento());
System.out.println("恢复后的状态:" + o.getState());
}
}
调用结果:
备忘录的本质是保存和恢复内部状态。