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

  备忘录模式应用场景:Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的只是众多属性中的一小部分时,Originator(发起人)可以根据保存的Memento信息还原到前一状态。一些对象的内部信息必须要存在对象以外的地府,但是必须要由对象自己读取,这时,使用备忘录可以把复杂的对象内部信息对其他的对象屏蔽起来,从而可以且当地保持封装的边界。
     感觉最大的作用还是在当角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将这个状态复原。

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

 1 /**
 2  * 发起人Originator类
 3  * @author 贤元
 4  *
 5  */
 6 public class Originator {
 7     //需要保存的属性,可能有多个
 8     private String state;
 9
10     //创建备忘录,将当前需要保存的信息导入并实例化出一个Memento对象。
11     public Memento createMemento(){
12         return new Memento(state);
13     }
14
15     //恢复备忘录,将Memento导入并将相关数据恢复
16     public void setMemento(Memento memento){
17         state = memento.getState();
18     }
19
20     //显示数据
21     public void show(){
22         System.out.println("state="+state);
23     }
24
25
26
27     public String getState() {
28         return state;
29     }
30
31     public void setState(String state) {
32         this.state = state;
33     }
34
35
36 }

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

 1 //备忘录memento类
 2 public class Memento {
 3     private String state;
 4
 5     //构造方法,将相关数据导入
 6     public Memento(String state){
 7         this.state = state;
 8     }
 9
10     //需要保存的数据属性,可以是多个
11     public String getState() {
12         return state;
13     }
14
15
16 }

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

 1 //管理者
 2 public class Caretaker {
 3     private Memento memento;
 4
 5     //得到备忘录
 6     public Memento getMemento() {
 7         return memento;
 8     }
 9     //设置备忘录
10     public void setMemento(Memento memento) {
11         this.memento = memento;
12     }
13     //在备忘录中存发起人的原始数据。通过管理者将备忘录中的数据给发起人,从而将发起人恢复到原始状态。
14 }

测试:

 1 public class Client {
 2     public static void main(String[] args) {
 3         //发起人
 4         Originator o = new Originator();
 5         o.setState("原初始状态-On");//Originator初始状态,状态属性为"On"
 6         o.show();//state=原初始状态-On
 7
 8         //管理者
 9         Caretaker c = new Caretaker();
10         //保存状态时,由于有了很好的封装,可以隐藏Originator的实现细节
11         c.setMemento(o.createMemento());//o.CreateMemento()表示创建一个备忘录,并将发起人的数据保存在备忘录中
12
13         //originator发起人改变了状态属性为"Off"
14         o.setState("改变后的状态Off");
15         o.show();//state=改变后的状态Off
16
17         //恢复原初始状态
18         o.setMemento(c.getMemento());
19         o.show();//state=原初始状态-On
20     }
21 }

UML图:

  

转载于:https://www.cnblogs.com/lixianyuan-org/p/9517849.html

备忘录模式--如果再回到从前相关推荐

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

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

  2. 设计模式之备忘录模式(Memento)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  3. java备忘录模式应用场景_图解Java设计模式之备忘录模式

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

  4. 设计模式(行为型模式)——备忘录模式(Memento)

    2019独角兽企业重金招聘Python工程师标准>>> 本章讲讲第三类和第四类. 备忘录模式(Memento) 主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫 ...

  5. 《JAVA与模式》之备忘录模式

    备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一 ...

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

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

  7. 【设计模式】备忘录模式

    备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式. 介绍 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存 ...

  8. 备忘录模式(Memento)的原版与简化版实现

    备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 适用场景: 1.保存一个对象在某一个时刻的(部分) ...

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

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

最新文章

  1. Delphi开发的IOCP测试Demo以及使用说明。
  2. Python学习笔记(二):标准流与重定向
  3. Rsync文件同步服务
  4. saltstack与ansible对比
  5. 【ClickHouse】Hangout with ClickHouse
  6. Python的apidoc操作
  7. 在硅谷,人生的可能性不只有996
  8. 【Android实战】----从Retrofit源码分析到Java网络编程以及HTTP权威指南想到的
  9. 黑客入门,从HTB开始
  10. 【三维目标检测可视化】三维点云目标检测与图像融合可视化
  11. java 文件上传(使用多线程)
  12. 【kimol君的无聊小发明】—用python写音乐下载器
  13. 制作一幅简单的ArcGIS故事地图
  14. 按头安利 好看又实用的相机 单反免抠元素素材看这里
  15. pmp项目管理师证书有什么用?
  16. Elasticsearch7.17 二:mapping映射和高级语法查询DSL
  17. Android 环信 消息免打扰 实现
  18. 【牛客】网易2018校招数据分析师笔试解析
  19. 计算机二级msoffice设计,2017计算机二级MSoffice攻关必做题
  20. 区块链笔记-(肖臻)(二刷自用笔记)-----三

热门文章

  1. 管理员回复留言php,最新WordPress评论邮件通知管理员及回复评论者(详细教程)...
  2. python锁机制_Python并发编程之谈谈线程中的“锁机制”(三)
  3. python发送图片邮件exchangelib_python基于exchange函数发送邮件过程详解
  4. linux配置usb主从_技术 | 手把手教你搭建MySQL主从架构
  5. Java常用工具类StringUtils的常用方法
  6. android编译的错误日志,android编译遇到错误
  7. c语言中有无注释重要吗,求助!有什么问题没考虑到吗? (c语言,大部分注释都写啦)...
  8. 什么影响matlab损失值,matlab – 在计算Logistic损失函数的值和梯度时避免数值溢出...
  9. multipartfile转excel_SpringMVC 上传文件 MultipartFile 转为 File的方法
  10. php strrew,友价域名交易系统nginx环境的伪静态规则