备忘录模式
1、定义
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
2、结构图
- Originator(发起人):
负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。
Originator可以根据需要决定Memento存储自己的哪些内部状态。 - Memento(备忘录):
负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘
录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,
允许它访问返回到先前状态所需要的所有数据。 - Caretaker(管理者):
负责备忘录Memento,不能对Memento的内容进行访问或者操作。
3、代码
(1)备忘录
public class Memento {
public Memento(String status) {
super();
this.status = status;
}
private String status;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
(2)管理者
public class CareTaker {
private Memento memento;
public void saveMemento(Memento memento){
this.memento = memento;
}
public Memento retrieveMemento(){
return this.memento;
}
}
(3)发起人
public class Originator {
private String state;
/**
* 工厂方法,返回一个新的备忘录对象
*/
public Memento createMemento(){
return new Memento(state);
}
/**
* 将发起人恢复到备忘录对象所记载的状态
*/
public void restoreMemento(Memento memento){
this.state = memento.getStatus();
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
System.out.println("当前状态:" + this.state);
}
}
(4)客户端
public class Client {
public static void main(String[] args) {
CareTaker careTaker = new CareTaker();
Originator originator = new Originator();
originator.setState("on");
careTaker.saveMemento(originator.createMemento());
originator.setState("off");
originator.restoreMemento(careTaker.retrieveMemento());
System.out.println("回复后state:"+originator.getState());
}
}
(5)运行结果
当前状态:on
当前状态:off
回复后state:on
4、总结
- 有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时,
使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。 - 本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需
要的这些状态的版本。 - 当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。