Memento Patterns
GoF定义:在不破坏(类)封装的情况下,获取一个对象当前的状态,使得之后这个对象可以恢复成这个状态
概念
目的是为了保存对象当前的状态,这样在之后可以恢复成这个状态。这个模式中有三个角色,分别为备忘录(memento),看管人(caretaker),创始人(originator)。备忘录会存储创始人(对象)的状态,创始人可以保存自己的内部状态并且可以恢复成历史的状态。创始人也可以从备忘录获取数据来恢复状态。看管人负责备忘录的安全并且不查看备忘录的内容
例子
现实世界:我们经常使用撤销快捷键(cmd+z)
代码世界:有限状态机(研究有限内存情况下的计算而抽象出来的计算模型),事务回滚
展示

代码
public class MementoPatternEx
{
public static void main(String[] args)
{
System.out.println("***Memento Pattern Demo***\n");
Originator o = new Originator();
o.setState("First state");
// Holding old state
Caretaker c = new Caretaker();
c.setMemento(o.originatorMemento());
//Changing state
o.setState("Second state");
// Restore saved state
o.Revert(c.getMemento());
}
}
class Caretaker
{
private Memento memento;
public void setMemento(Memento memento)
{
this.memento = memento;
}
public Memento getMemento()
{
return memento;
}
}
class Memento
{
private String state;
public Memento(String state)
{
this.state = state;
}
public String getState()
{
return state;
}
}
class Originator
{
private String state;
private Memento memento;
public void setState(String state)
{
this.state = state;
}
public Memento originatorMemento()
{
this.memento = new Memento(this.state);
return this.memento;
}
public void Revert(Memento memento)
{
System.out.println("Restoring to previous state...");
this.state = memento.getState();
System.out.println("State at present :" +state);
}
}
Note
- 建议Memento对象是不透明对象,即Caretaker对象不能修改它
- 要特别注意,不能让Originator对象的改变影响到Memento对象的状态
- 有时这个模式的性能开销可能很大(状态的内容很多),而且在1的限制下,Caretaker对象不知道状态中哪些部分是可以删除的
思考
代码内实现对象的快照功能,基本是备忘录和原对象即可完成功能,照看者的角色是不希望原对象保存自己的状态两次(备忘录一次,本身一次)而出现的
浙公网安备 33010602011771号