《Design Patterns》Memento.积跬步系列

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就是负责保存某一时刻状态的对象。这个类中的属性可以根据我们的需要进行有选择性、针对性的保存。该模式比较适用于功能比较复杂,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分,当角色的状态改变时,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。当然这个暂时的备忘录如果想要其比较稳定,不会因为内存太小等因素保存失败等,可将其保存在硬盘上。
与原型模式的差别:原型模式强调的是对象原封不动的复制/克隆,而备忘录模式讲究的是将对象中某一时刻的内部状态备份/部分备份。
其他例子:参考自《大话设计模式》游戏备份及回到某一个备份时刻。


注:以上文章仅是个人总结,若有不当之处,望不吝赐教

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值