[设计模式笔记]三. 行为型模式--20. Memento模式(备忘录)对象行为型模式(一)

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


一. 意图


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

        一个备忘录(memento)是一个对象它存储另一个对象在某个瞬间的内部状态而后者称为备忘录的原发器(originator). 当需要设置原发器的检查点时取消操作机制会向原发器请求一个备忘录原发器用描述当前状态的信息初始化该备忘录只有原发器可以向备忘录中存取信息备忘录对其他的对象"不可见".


二. 适用性


        必须保存一个对象在某一个时刻的(部分)状态这样以后需要时它才能恢复到先前的状态.

        如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性.

        (当我看到说需要备份一个对象的内部状态时我第一时间就想到在对象中公开一个接口用于备份对象的状态其实这样做是正确的但是不能让所有对象都能使用这个接口来获取该对象的状态而是使用指定类型的对象在该模式中该对象就是Memento类的对象.看 Originator::SetMemento(Memento m))


三. 模式结构


图1 


四. 角色说明


Memento(备忘录)

—备忘录存储原发器对象的内部状态原发器根据需要决定备忘录存储原发器的哪些内部状态.

防止原发器以外的其他对象访问备忘录备忘录实际上有两个接口管理者(caretaker)只能看到备忘录的窄接口—它只能将备忘录传递给其他对象相反原发器能够看到一个宽接口允许它访问返回到先前状态所需的所有数据理想的情况是只允许生成本备忘录的那个原发器访问本备忘录的内部状态.


Originator(原发器)

—原发器创建一个备忘录以记录当前时刻它的内部状态.

—使用备忘录恢复内部状态.


Caretaker(负责人)

—负责保存好备忘录.

—不能对备忘录的内容进行操作或检查


交互


图2


五. 说明


1. 保持封装边界 使用备忘录可以避免暴露一些只应由原发器管理却又必须存储在原发器之外的信息该模式把可能很复杂的Originator内部信息对其他对象屏蔽起来从而保持了封装边界.

2. 它简化了原发器如果不使用备忘录模式原发器状态的备份可能需要它自己来存储.

3. 使用备忘录可能代价很高特别是在原发器的状态信息很复杂时频繁的状态拷贝开销会很大.

4. 维护备忘录的潜在代价管理器负责删除它所维护的备忘录然而管理器不知道备忘录中有多少个状态. (个人认为既然备忘录比较熟悉这些状态备忘录来负责对状态的删除而不是管理器.)


我的理解


1. 备忘录模式提供了一个很好的方法怎样实现一个对象中的属性只对某些对象开放(通过Originator::SetMemento(Memento m)).

2. 看备忘录模式的结构图知道, Originator::SetMemento(Memento m)很关键, Originator不管理Memento, MementoCaretaker管理.

3. 当我看到备忘录模式时对比它也是存储一个对象的某时刻的状态时我想到了Command模式因为Command模式实现的功能通常有向前/向后功能(例如菜单操作). 而备忘录则可以对该功能的状态存储提供实现方法.

4. 个人认为实现向前/向后功能更关键的是你对状态的分析特别是那些影响全局状态的.


相关模式


Command: 命令可使用备忘录来为可撤消的操作维护状态.

Iterator: 如前所述备忘录可用于迭代.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值