备忘录模式

备忘录(Memento)模式又称标记(Token)模式。在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
在讲命令模式的时候,我们曾经提到利用中间的命令角色可以实现undo、redo的功能。从定义可以看出备忘录模式是专门来存放对象历史状态的,这对于很好的实现undo、redo功能有很大的帮助。所以在命令模式中undo、redo功能可以配合备忘录模式来实现。其实单就实现保存一个对象在某一时刻的状态的功能,还是很简单的——将对象中要保存的属性放到一个专门管理备份的对象中,需要的时候则调用约定好的方法将备份的属性放回到原来的对象中去。
备忘录模式的组成部分
1、备忘录(Memento)角色:备忘录角色存储‘备忘发起角色’的内部状态。‘备忘发起角色’根据需要决定备忘录角色存储‘备忘发起角色’的哪些内部状态。为了防止‘备忘发起角色’以外的其他对象访问备忘录。备忘录实际上有两个接口,‘备忘录管理者角色’只能看到备忘录提供的窄接口——对于备忘录角色中存放的属性是不可见的。‘备忘发起角色’则能够看到一个宽接口——能够得到自己放入备忘录角色中属性。
2、备忘发起(Originator)角色:‘备忘发起角色’创建一个备忘录,用以记录当前时刻它的内部状态。在需要时使用备忘录恢复内部状态。
3、备忘录管理者(Caretaker)角色:负责保存好备忘录。不能对备忘录的内容进行操作或检查。我们称它为宽接口;而另一个则可以只是一个标示,我们称它为窄接口。
备忘录角色要实现这两个接口类。这样对于‘备忘发起角色’采用宽接口进行访问,而对于其他的角色或者对象则采用窄接口进行访问。这种实现比较简单,但是需要人为的进行规范约束——而这往往是没有力度的。第二种方法便很好的解决了第一种的缺陷:采用内部类来控制访问权限。将备忘录角色作为‘备忘发起角色’的一个私有内部类。
备忘录模式适用情况
使用了备忘录模式来实现保存对象的历史状态可以有效地保持封装边界。使用备忘录可以避免暴露一些只应由‘备忘发起角色’管理却又必须存储在‘备忘发起角色’之外的信息。把‘备忘发起角色’内部信息对其他对象屏蔽起来, 从而保持了封装边界。但是如果备份的‘备忘发起角色’存在大量的信息或者创建、恢复操作非常频繁,则可能造成很大的开销。
使用备忘录模式的前提是什么:
1、必须保存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。
2、如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。
备忘录模式的实现
1、备忘录模式中的角色
发起人:创建含有内部状态的备忘录对象,并使用备忘录对象存储状态
负责人:负责人保存备忘录对象,但不检查备忘录对象的内容
备忘录:备忘录对象将发起人对象的内部状态存起来,并保正其内容不被发起人对象之外的对象像读取
注意:在备忘录的角色中,定义了他必须对不同的人提供不同的接口,对发起人提供宽接口,对其它任何人提供窄接口。也许你说我都提供宽接口得了。对这也是备忘录的一种实现,叫做白箱备忘录,不过这种方法的封装没有设计好,安全性不够好。
2、白箱的优点:实现简单白箱的缺点:上边说了,破坏了封装,安全性有些问题。
3、双接口的实现,宽窄接口(黑箱)
如何实现宽窄接口呢,内部类也许是个好方法。我们把备忘录类设计"成发起人"的内部类,但这样还有的问题是同一package中的其它类也能访问到,为了解决这个问题,我们可以把"备忘录"的方法设计成私有的方法,这样就可以保正封装,又保正发起人能访问到。
备忘录角色的作用
1、将发起人对象的内部状态存储起来,备忘录能根据发起人对象的判断来决定存储多少发起人对象的内部状态。
2、备忘录能保护其内容不被发起人对象之外的所有对象所读取。
发起人角色的作用
1、创建一个含有当前内部状态的备忘录对象。
2、使用备忘录对象存储其内部状态。
负责人角色的作用
负责保存备忘录对象和不检查备忘录对象的内容。
备忘录模式与命令模式的区别
相同:都可以前进后退。
不同:执行对象不同,保存状态的对象不通,所执行的操作也不相同。
由于两种模式时所对应的需求截然不同,应该说备忘录更加稳定一些,而命令的执行则更加广泛,可能一个子类的Command对应一个Receiver。所以相对而言Command模式会更加灵活一些。
应用:
Command模式:将命令当作一个对象进行保存,进行Redo ,Undo操作。例子:在绘图系统中经常需要进行Redo,Undo操作。
Memento模式:获取和保存对象的内部状态。例子:网上购物时购物车既可以理解为Memento。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值