Memento:备忘录模式
先代码
package h.l.demo.Memento;
/**
*
* @author: Is-Me-Hl
* @date: 2020年3月1日
* @Description: 备忘录模式Demo
*/
public class Memento {
public static void main(String[] args) {
Originator originator = new Originator();
originator.setStateA("内部状态A");
originator.setStateB("内部状态B");
System.out.println("当前对象内部状态:" + originator);
// 对当前状态进行备份
MementoClass mementoClass = originator.createMementoClass();
// 改变当前状态
originator.setStateA("内部状态AA");
originator.setStateB("内部状态BB");
// 当前状态
System.out.println("修改当前状态:" + originator);
// 对当前状态进行还原
originator.revert(mementoClass);
// 还原后的状态
System.out.println("还原后状态:" + originator);
}
}
/**
*
* @author: Is-Me-Hl
* @date: 2020年3月1日
* @Description: 发起人,负责创建一个备忘录Memento,用于记录当前时刻它的状态,并可使用备忘录模式恢复状态
* 该类可以决定Memento备忘录对象存放哪些内部状态信息
*/
class Originator {
// 内部状态A
private String stateA;
// 内部状态B
private String stateB;
// 创建一个当前时刻副本
public MementoClass createMementoClass() {
return new MementoClass(stateA, stateB);
}
// 恢复指定副本
public void revert(MementoClass mementoClass) {
this.stateA = mementoClass.getStateA();
this.stateB = mementoClass.getStateB();
}
public void setStateA(String stateA) {
this.stateA = stateA;
}
public void setStateB(String stateB) {
this.stateB = stateB;
}
@Override
public String toString() {
return "Originator [stateA=" + stateA + ", stateB=" + stateB + "]";
}
}
/**
*
* @author: Is-Me-Hl
* @date: 2020年3月1日
* @Description: 备忘录:可以保存一些想要保存的信息
*/
class MementoClass {
// 保存状态A
private String stateA;
// 保存状态B
private String stateB;
public MementoClass(String stateA, String stateB) {
this.stateA = stateA;
this.stateB = stateB;
}
@Override
public String toString() {
return "MementoClass [stateA=" + stateA + ", stateB=" + stateB + "]";
}
public String getStateA() {
return stateA;
}
public String getStateB() {
return stateB;
}
}
测试结果:
后分析
- 个人建议:写代码是件幸福的事,So,do it
备忘录模式,定义是:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
根据上面的代码可以看出来,MementoClass就是负责保存某一时刻状态的对象。这个类中的属性可以根据我们的需要进行有选择性、针对性的保存。该模式比较适用于功能比较复杂,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分,当角色的状态改变时,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。当然这个暂时的备忘录如果想要其比较稳定,不会因为内存太小等因素保存失败等,可将其保存在硬盘上。
与原型模式的差别:原型模式强调的是对象原封不动的复制/克隆,而备忘录模式讲究的是将对象中某一时刻的内部状态备份/部分备份。
其他例子:参考自《大话设计模式》游戏备份及回到某一个备份时刻。
注:以上文章仅是个人总结,若有不当之处,望不吝赐教