举个栗子
以保存游戏为例,在玩魂斗罗之前,一般在快到boss的时候,我会先保存游戏的状态。与boss作战时万一游戏挂了。可以利用备忘录恢复到战前状态了。
基本概念
备忘录模式:获取一个对象的某个状态,并且在对象之外保存,使得在需要的情况下恢复对象。(不会破坏封装性) 又叫做快照模式(Snapshot Pattern)或者Token模式,是23种设计模式之一
用例图示
角色分类
- Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。
- Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
- Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作。
角色职责
发起人
- 创建一个含有当前的内部状态的备忘录对象
- 使用备忘录对象存储内部状态
负责人 管理者
- 负责保存备忘录对象
- 不检查备忘录对象的内容
优缺点
优点
1. 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
2. 实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点
消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
应用实例
1、后悔药。
2、打游戏时的存档。
3、Windows 里的 ctri + z。
4、IE 中的后退。
5、数据库的事务管理。
总之是一些需要保存/恢复数据地相关状态场景,以及需要提供一个可回滚地操作。
注意事项
1、为了符合迪米特原则,还要增加一个管理备忘录的类。
2、为了节约内存,可使用原型模式+备忘录模式。
代码实现:
github
备忘录模式