定义
备忘录(Memento)模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。
该模式又叫快照模式。
实现
Gof书中的代码实现方法如下:
public class MementoPattern {
public static void main(String[] args) {
Originator or = new Originator();
Caretaker cr = new Caretaker();
or.setState("defaultState");
System.out.println("初始状态:" + or.getState());
cr.setMemento(or.createMemento()); //保存状态
or.setState("newState");
System.out.println("新的状态:" + or.getState());
or.restoreMemento(cr.getMemento()); //恢复状态
System.out.println("恢复状态:" + or.getState());
}
}
//备忘录
class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
//发起人
class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
public Memento createMemento() {
return new Memento(state);
}
public void restoreMemento(Memento m) {
this.setState(m.getState());
}
}
//管理者
class Caretaker {
private Memento memento;
public void setMemento(Memento m) {
memento = m;
}
public Memento getMemento() {
return memento;
}
}
他们是通过将状态state
保存在备忘录对象Memento
中,管理者Caretaker
将其封装,发起人Originator
中写出创建状态和恢复状态方法,主方法中调用实现。
当然实际开发中根据业务需求可以把状态写为文件把存进磁盘中,这样就保证了“备忘录”的持久性,但也可能引来文件过多导致消耗磁盘空间过多的等问题。
应用
- 版本控制
- 快照
- 游戏等存档
- ···