备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有”后悔药”可吃。

大话设计模式中程杰老师给出的定义是,备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态

备忘录模式使用三个类 Memento、Originator 和 CareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态。MementoPatternDemo,我们的演示类使用 CareTaker 和 Originator 对象来显示对象的状态恢复。

结构图解析:

Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可以使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的哪些内部状态。

Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录Memento。备忘录有两个接口,CareTaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。

CareTaker(管理者):负责保存好备忘录Memento,不能对备忘录的内容进行操作和检查。

客户不与备忘录类耦合,与备忘录管理类耦合

实现代码如下:

package com.exercise.memento;public class Memento {public String state;public Memento(String state) {this.state = state;}public String getState() {return state;}}
package com.exercise.memento;public class Originator {public String state;public String getState() {return state;}public void setState(String state) {this.state = state;}public void getStateFromMemento(Memento memento){state = memento.getState();}public Memento saveStateToMemento(){return new Memento(state);}
}
package com.exercise.memento;import java.util.ArrayList;
import java.util.List;public class CareTaker {private List<Memento> mementos = new ArrayList<Memento>();public void addMemento(Memento memento){mementos.add(memento);}public Memento getMemonto(int index){return mementos.get(index);}
}
package com.exercise.memento;public class MementoPatternDemo {public static void main(String[] args) {Originator originator = new Originator();CareTaker careTaker = new CareTaker();originator.setState("State #1");originator.setState("State #2");careTaker.addMemento(originator.saveStateToMemento());originator.setState("State #3");careTaker.addMemento(originator.saveStateToMemento());originator.setState("State #4");System.out.println("Current State: " + originator.getState());        originator.getStateFromMemento(careTaker.getMemonto(0));System.out.println("First saved State: " + originator.getState());originator.getStateFromMemento(careTaker.getMemonto(1));System.out.println("Second saved State: " + originator.getState());}}

Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一部分的时候,Originator可以根据保存的Memento信息还原到前一状态。另外,如果在某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来存储可撤销操作的状态。有时一些对象的内部信息必须保存在对象以外的地方,但是必须要对向自己读取,这时,使用备忘录模式可以把复杂的对象北部信息对其他的对象屏蔽起来,从而可以恰当的保持封装的边界。

简而言之,备忘录模式最重要的作用就是当角色的状态发生改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原

应用实例:

1、打游戏时的存档。
2、Windows 里的 ctri + z。
3、IE 中的后退。
4、数据库的事务管理。

优点:

1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
2、实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点:

消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

使用场景:

1、需要保存/恢复数据的相关状态场景。
2、提供一个可回滚的操作。

注意事项:

1、为了符合迪米特原则,还要增加一个管理备忘录的类。
2、为了节约内存,可使用原型模式+备忘录模式。

大话设计模式—备忘录模式相关推荐

  1. 大话设计模式-备忘录模式学习总结

    一.概念: 备忘录:在不破坏封装性的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态,这样以后可以将该对象恢复到原来保存的状态. 二.类图以及基本代码 //发起者 public class O ...

  2. 大话设计模式-备忘录模式

    备忘录模式 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态. 备忘录模式的特点 备忘录模式比较适用于比较复杂但需要维护或记录属性 ...

  3. 7、大话设计模式--状态模式 、适配器模式、备忘录模式、组合模式、迭代器模式

    第十六章:无尽加班何时休--状态模式 状态模式 :   优点: 缺点: 所使用的项目是:工作状态 功能: 界面: 设计思路: 收获: 附: 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出 ...

  4. linkin大话设计模式--常用模式总结

    linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...

  5. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  6. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  7. Java设计模式——备忘录模式

    Java设计模式--备忘录模式 需求 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状 ...

  8. 设计模式-备忘录模式(Memento)-Java

    设计模式-备忘录模式(Memento)-Java 目录 文章目录 1.前言 2.示例案例-可悔棋的中国象棋 3.备忘录模式概述 3.1.备忘录模式定义 3.2.备忘录模式结构 3.3.备忘录模式结构图 ...

  9. linkin大话设计模式--桥接模式

    linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...

最新文章

  1. Exynos 4412启动过程(群聊笔记记录)
  2. Java并发编程(1):可重入内置锁
  3. linux本地时间与utc不一致_Linux Windows 双系统时间不一致
  4. 【渝粤教育】电大中专药物分析技术基础作业 题库
  5. BZOJ4520 CQOI2016K远点对(KD-Tree+堆)
  6. 笨方法“学习python笔记之函数
  7. 排序算法(5)----堆排序
  8. neo4j 机器学习_知识图谱实战系列四:neo4j的介绍和使用
  9. App后台开发运维和架构实践学习总结(10)——基于Java-JWT前后端token认证实战使用详解
  10. Linux之父新年首次“炮轰”:英特尔在扼杀整个ECC行业
  11. ADMM随堂笔记(3):一致和协同
  12. 长文预警-超详细的熊猫烧香病毒分析_01
  13. 先进事迹计算机维护与维修,汽车维修工先进事迹
  14. mac 树莓派 kali linux系统,MacOS制作树莓派kali系统
  15. Kali Linux安装dvwa本地shentou测试环境
  16. [置顶] 程序员的奋斗史(二十八)——寒门再难出贵子?
  17. Linux locale命令
  18. 大家来说说大数据时代与真正跨平台应用,如何结合的更好
  19. 晚上看了一个知乎评论区,我失眠了
  20. 3. adb常用命令

热门文章

  1. squid之反向代理服务器
  2. 安装 RAILS ANNOTATE_MODELS 插件.
  3. socket的系统调用
  4. v8学习笔记(七) 执行过程
  5. Java 对象初始化过程
  6. JFreeChart 使用介绍
  7. TensorFlow数据读取机制:文件队列 tf.train.slice_input_producer和 tf.data.Dataset机制
  8. 如何发布Android Library到maven私有仓库
  9. SDNU 1330.Max Sum(最大子序列和)
  10. zepto中的tap穿透