一、理论

Without violating encapsulation,capture and externalize an object’s internal state so that the object can be restored to this state later.
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

  • Originator(生成者)
    Originator角色会在保存自己的最新状态时生成Memento角色。当把以前保存的Memento角色传递给Originator角色时,它会将自己恢复至生成该Memento角色时的状态。
  • Memento(备忘录)
    Memento角色会将Originator 角色的内部信息整合在一起。在 Memento角色中虽然保存了Originator角色的信息,但它不会向外部公开这些信息。
    Memento角色有以下两种接口(API ):
    wide interface——宽接口(API):Memento 角色提供的“宽接口(API)”是指所有用于获取恢复对象状态信息的方法的集合。由于宽接口(API)会暴露所有Memento角色的内部信息,因此能够使用宽接口(API)的只有Originator角色。
    narrowinterface——窄接口(API ):Memento角色为外部的Caretaker角色提供了“窄接口(API)”。可以通过窄接口(APl)获取的Memento角色的内部信息非常有限,因此可以有效地防止信息泄露。
  • Caretaker(备忘录管理员)
    当Caretaker角色想要保存当前的Originator角色的状态时,会通知Originator角色。Originator角色在接收到通知后会生成Memento角色的实例并将其返回给Caretaker角色。由于以后可能会用Memento实例来将Originator恢复至原来的状态,因此Caretaker角色会一直保存Memento实例。

二、代码

生成者:

@Data
@AllArgsConstructor
public class Originator {private String state;/*** 创建一个备忘录** @return*/public Memento createMemento() {return new Memento(this.state);}/*** 从备忘录恢复** @param memento*/public void restoreMemento(Memento memento) {this.state = memento.getState();}
}

备忘录:

@Data
@AllArgsConstructor
public class Memento {private String state;
}

备忘录管理员:

@Data
public class CareTaker {private Memento memento;
}

客户端:

public class Client {public static void main(String[] args) {Originator oraBoy = new Originator("心情一般");//当前状态进行备份Memento memento = oraBoy.createMemento();CareTaker careTaker = new CareTaker();careTaker.setMemento(memento);System.out.println("男孩去追求女孩,成功了");oraBoy.setState("心情很好");System.out.println("男孩当前的心情:" + oraBoy.getState());System.out.println("男孩后悔了,分手了");oraBoy.restoreMemento(careTaker.getMemento());System.out.println("男孩现在的心情:" + oraBoy.getState());}
}

三、总结

  1. 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
  2. 实现了信息的封装,使得用户不需要关心状态的保存细节
  3. 如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存, 这个需要注意
  4. 适用的应用场景:1、后悔药。 2、打游戏时的存档。 3、Windows 里的 ctri + z。 4、IE 中的后退。 4、数据库的事务管理
  5. 为了节约内存,备忘录模式可以和原型模式配合使用

设计模式——行为型——备忘录模式相关推荐

  1. [设计模式-行为型]备忘录模式(Memento)

    一句话 让某个对象可以取到之前的某个状态值. 概括 解析 MEMENTO-同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么 ...

  2. 设计模式 - 行为型 - 模板模式学习

    现象: 设计模式 - 行为型 - 模板模式学习 介绍: 模板模式的设计思路,在抽象类中定义抽象方法的执行顺序, 并将抽象方法设定为只有子类实现,但不提供独立访问的方法 只能通过已经被安排好的定义方法去 ...

  3. 设计模式笔记(21)---备忘录模式(行为型)

    Gof定义 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态. 动机 在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需 ...

  4. Java描述设计模式(24):备忘录模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时, ...

  5. java备忘录模式应用场景_Java描述设计模式(24):备忘录模式

    一.生活场景 1.场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时,视频会从上次切走的时间点继续播放.下面基于备忘录设计模式来 ...

  6. 一天一种设计模式之二-----备忘录模式

    2019独角兽企业重金招聘Python工程师标准>>> 一.备忘录模式 备忘录模式属于三种设计模式中的行为型模式(另外两种是创建型模式和结构型模式). 定义:在不破坏封闭性的前提下, ...

  7. java备忘录代码和解释_Java描述设计模式(24):备忘录模式

    一.生活场景 1.场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时,视频会从上次切走的时间点继续播放.下面基于备忘录设计模式来 ...

  8. IOS设计模式之四(备忘录模式,命令模式)

    本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...

  9. 设计模式行为型-状态模式

    最近学习了设计模式行为型中的状态模式,这个模式的就完全体现出"多态"这种性质了,首先是它的解释:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 为什么说状 ...

最新文章

  1. 操作系统课设--具有优先级的线程调度
  2. C# hashtable
  3. 微信小程序的scroll-view组件
  4. Linux网络服务器epoll模型的socket通讯的实现(一)
  5. mysql删除新添加数据,MySQL添加、更新与删除数据
  6. 20155222 卢梓杰 myod
  7. python+Django框架运用(一)
  8. 快速理解MapReduce
  9. python对矩阵对角线进行赋值
  10. 数据分析用这样的可视化报表,秒杀Excel,再也不怕被说low
  11. swagger - RESTFUL接口文档在线自动生成、代码自动生成工具详解
  12. Java的核心技术有哪些
  13. LaunchAnywhere载入Java VM时windows出现错误:2以及216
  14. 企业公众号如何申请开通模板消息功能?
  15. 计算机专业人才需求大吗,对计算机专业人才需求现状
  16. 深度学习入门笔记(1)——什么是深度学习?
  17. data mining - 实用机器学习工具与技术 - 读书笔记( 一 )
  18. 衡水二中2021年高考成绩查询,2020衡水二中高考喜报
  19. DecimalFormat - 格式化数据
  20. EGE相关:控制台窗口的设置

热门文章

  1. 剑指offer跳楼梯
  2. 浙江大学计算机学院 00级,浙江大学教师划分为13个等级
  3. ubuntu实时显示网速cpu占用和内存占用率
  4. H3C防火墙基础配置3-配置对象策略
  5. SIC8833芯片开发厨房电子秤方案
  6. 分享公众号抽奖的作用_微信公众号抽奖活动怎么弄
  7. mobl:针对移动Web开发的DSL
  8. 基于java的药店药品进销存管理系统
  9. ASTERISK 拨号方案基础
  10. 计算机网络课程设计(模拟总公司、分公司的局域网)