1 引子
对于我们而言,时常反悔是常有的事情,程序中也经常出现此类情况。为了使程序反悔,即恢复到对象的某一状态,前辈总结出一个设计模式,称之为备忘录模式。备忘录模式的关键在于利用备忘类记录对象的某些或者全部状态,然后在需要的地方恢复对象的状态。备忘录模式实现的方式需要保证被保存的状态不能被对象从外部访问,目的是为了保护被保存的对象状态的完整性以及内部实现不向外暴露。
备忘录模式原理代码:
需要保存对象状态的类,称为发起者Originator:
public class Originator {
private String state;
public Meno createMeno(String state) {
return new Meno(state); // 创建备忘录
}
public void resetMeno(Meno meno) {
this.state = meno.getState(); // 恢复此刻备忘录的状态;
}
public void setState(String state){
this.state = state;
}
public String getState() {
System.out.println("对象此刻的state:" + state);
return state;
}
}
保存对象状态的类,称为备忘类Meno:
public class Meno {
private String state;
public Meno(String state) {
this.state = state;
}
public String getState(){
return state;
}
}
操作备忘录的类,称为照看类CareTake:
public class CareTake {
private Meno meno;
public void saveMeno(Meno meno){
this.meno = meno; // 保存备忘录
}
public Meno retrieveMeno(){
return meno; // 恢复备忘录
}
}
客户端调用类Client:
public class Client {
public static void main(String[] args){
Originator originator = new Originator();
CareTake careTake = new CareTake();
String state = "1";
String state2 = "2";
originator.setState(state); // 设置对象的状态
originator.getState();
careTake.saveMeno(originator.createMeno(state));
originator.setState(state2);
originator.getState();
originator.resetMeno(careTake.retrieveMeno());
originator.getState();
}
}
运行结果:
对象此刻的state:1
对象此刻的state:2
对象此刻的state:1
根据结果可知,对象的状态从1到2,再恢复到1。
2 备忘录模式原理
《大话设计模式》中这样解释备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,便于该对象恢复到原先保存的状态。在开始一直有个疑问,对象的状态保存到Meno对象中,而meno对象在Client类内部,需要的时候直接获取meno对象的内部状态即可,压根不需要CareTake类;后来发现CareTake类可以保证备忘对象meno不容易被干扰,从而保证memo对象的封装性。
Originator类:需要保存状态的类,含有保存状态和恢复状态的功能;
Meno类:存放状态的类,为了保证状态的完整性和封装性,originator对象无法直接操作meno对象;
CareTake类:操作meno对象的类,不能修改meno对象,只是起到一个连接originator对象和mono对象的桥梁;
3 备忘录模式特点
备忘录可以帮助对象轻松回到过去的状态,且状态节点不受对象的影响。
4 备忘录模式使用场景
对于某对象状态可能失效,且状态非常重要的情况,可以利用备忘录模式恢复对象的状态。
5 参考资料
https://blog.csdn.net/u012124438/article/details/70473553
《大话设计模式》