Memento(备忘录)--对象行为型模式

Memento(备忘录)–对象行为型模式

一、意图
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保持这个状态。这样以后就可将该对象恢复到原先保存的状态。

二、动机
1.在软件构建过程中,某些对象的状态子啊转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。
2.如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。

三、适用性
1.必须保存一个对象在某个时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。
2.如果一个用接口来让你过其他对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

四、结构
在这里插入图片描述

五、效果
1.保持封装边界 使用备忘录可以避免暴露一些只应由原发器之外的信息。该模式把可能很复杂的Originator内部信息对其他对象屏蔽起来,从而保持了封装边界。
2.它简化了原发器 在其他的保持封装性的设计中,Originator负责保持客户请求过的内部状态版本。这就把所有存储管理的重任交给了Originator。让客户管理它们请求的状态将会简化Originator,并且使得客户工作结束时无通知原发器。
3.使用备忘录可能代价很高 如果原发器在生成备忘录时必须拷贝存储大量的信息,或者客户非常频繁地创建备忘录和恢复原发器状态,可能导致非常大的开销。除非封装和恢复Originator状态的开销不大,否则该模式可能并不合适。
4.定义窄接口和宽接口 在一些语言中可能难以保证只有原发器可访问备忘录的状态。
5.维护备忘录的潜在代价 管理器负责删除它所维护的备忘录。然而,管理器不知道备忘录中有多少个状态。因此当存储备忘录时,一个本来很小的管理器,可能会产生大量的存储开销

六、实现
1.语言支持 备忘录有两个接口:一个为原发器所使用的宽接口,一个为其他对象所使用的窄接口。理想的实现语言应支持两级的静态保护。在C++中,可将Originator作为Mementor的一个友元,并使用Memento宽接口为私有。只有窄接口应该被声明为公共的。
2.存储增量式改变 如果备忘录的创建及其返回(给他们的原发器)的顺序是可预测的,备忘录可以仅存储原发器内部状态的增量改变。

七、要点总结
1.备忘录(Memento)存储原发器(Originator)对象的内部状态,在需要时恢复原发器状态。
2.Memento模式的核心是信息隐藏,即Originator需要向外界隐藏信息,保持其封装性。但同时又需要将状态保持到外界(Memento)
3.由于现代语言运行时(如C#、Java等)都具有相当的对象序列化支持,因此往往采用效率较高、又较容易正确实现的序列化方案来实现Memento模式。

八、相关模式
Command:命令可使用备忘录来为可撤销的操作维护状态。
Iterator:备忘录可用于迭代。

九、举例说明
相当于时光倒流器

本文为李建忠设计模式视频的笔记以及《设计模式-可复用面向对象的软件的基础》和自己的部分见解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值