备忘录模式(Memento Pattern)

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

核心 :就是保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到
原先的状态。

现实场景

  1. 录入大批人员资料。正在录入当前人资料时,发现上一个人录错了,
    此时需要恢复上一个人的资料,再进行修改;
  2. Word文档编辑时,忽然电脑死机或断电,再打开时,可以看到word
    提示你恢复到以前的文档;
  3. 管理系统中,公文撤回功能。公文发送出去后,想撤回来。

开发中常见的应用场景

  1. 棋类游戏中的,悔棋
  2. 普通软件中的,撤销操作
  3. 数据库软件中的,事务管理中的,回滚操作
  4. Photoshop软件中的,历史记录

备忘录模式的实现大致需要4个步骤

步骤1:定义源发器类(Originator),负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态

/*** 源发器类 Originator*/
public class Emp {private String ename;private int age;private double salary;//进行备忘操作,并返回备忘录对象public EmpMemento  memento(){return new EmpMemento(this);}//进行数据恢复,恢复成制定备忘录对象的值public void recovery(EmpMemento mmt){this.ename = mmt.getEname();this.age = mmt.getAge();this.salary = mmt.getSalary();}public Emp(String ename, int age, double salary) {super();this.ename = ename;this.age = age;this.salary = salary;}public String getEname() {return ename;}public void setEname(String ename) {this.ename = ename;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}
}

步骤2:定义备忘录类(Memento),负责存储Oreginator对象的内部状态,并可防止Originator以外的其它对象访问备忘录(Memento)。

/*** 备忘录类 Memento*/
public class EmpMemento {private String ename;private int age;private double salary;public EmpMemento(Emp e) {this.ename = e.getEname();this.age = e.getAge();this.salary = e.getSalary();}//get/set方法public String getEname() {return ename;}public void setEname(String ename) {this.ename = ename;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}
}

步骤3:定义 负责人类(CareTaker),负责保存好备忘录(Memento)。

/*** 负责人类 :负责管理备忘录对象*/
public class CareTaker {private EmpMemento memento;//private List<EmpMemento> list = new ArrayList<EmpMemento>();public EmpMemento getMemento() {return memento;}public void setMemento(EmpMemento memento) {this.memento = memento;}
}

步骤4:测试

/*** 测试*/
public class Client {public static void main(String[] args) {CareTaker taker = new CareTaker();Emp emp = new Emp("张三丰", 48, 900);System.out.println("第一次打印对象--- 姓名:"+emp.getEname()+" 年龄:"+emp.getAge()+" 薪水:"+emp.getSalary());taker.setMemento(emp.memento());   //备忘一次System.out.println("注意:备忘一次---");emp.setAge(18);emp.setEname("张无忌");emp.setSalary(9000);System.out.println("第二次打印对象--- 姓名:"+emp.getEname()+" 年龄:"+emp.getAge()+" 薪水:"+emp.getSalary());emp.recovery(taker.getMemento()); //恢复到备忘录对象保存的状态System.out.println("注意:恢复到备忘录对象保存的状态---");System.out.println("第三次打印对象--- 姓名:"+emp.getEname()+" 年龄:"+emp.getAge()+" 薪水:"+emp.getSalary());}
}

执行结果如下图所示:

如果想了解更多设计模式,可点击:设计模式概述 以及 23种设计模式的介绍

备忘录模式详解 (附java语言源码)相关推荐

  1. 确定有限状态机和非确定有限状态机详解 包含Java实现源码(Nondeterministic finite automata)

    本文将讲解确定有限自动状态机和非确定有限自动状态机的特点和区别.将结合图片例子重点讲解什么是非确定有限自动状态机.最后讲解如何将非确定状态机转换为确定的状态机.多图预警!! 有限自动状态机可以分为确定 ...

  2. (二十三)原型模式详解(clone方法源码的简单剖析)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 原型模式算是JAVA中最简单 ...

  3. base64加密原理详解及C语言源码

    base64加密原理详解 Base64从本质来说,其实并不是加密算法,只是一种编码方式而已,Base64的"加解密"也不叫加密解密,而是编码解码,但是现在一般都把它归为加密算法. ...

  4. 【数据结构】八大排序(超详解+附动图+源码)

    目录 前言 常见排序算法的实现 1.插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 6.1 hoare版本 6.2挖坑法 6.3前后指针法 6.4快速排序优化 6.5快速 ...

  5. QQ自动点赞PHP源码_QQ好友批量回名片赞工具-QQ自动点赞附易语言源码V1.0电脑版PC端回赞-西西软件下载...

    QQ自动点赞附易语言源码是一款电脑版QQ好友批量回名片赞工具下载附易语言源码和导入QQ号码方,PC端QQ回赞和源码,然后打开软件导入QQ号码即可批量赞了,每个好友可以赞10次,同时附带了源码可以编译成 ...

  6. java备忘录模式 类图,Android编程设计模式之备忘录模式详解

    本文实例讲述了Android编程设计模式之备忘录模式.分享给大家供大家参考,具体如下: 一.介绍 备忘录模式是一种行为模式,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态,这有点像我们平时 ...

  7. Java源码详解六:ConcurrentHashMap源码分析--openjdk java 11源码

    文章目录 注释 类的继承与实现 数据的存储 构造函数 哈希 put get 扩容 本系列是Java详解,专栏地址:Java源码分析 ConcurrentHashMap 官方文档:ConcurrentH ...

  8. Java源码详解四:String源码分析--openjdk java 11源码

    文章目录 注释 类的继承 数据的存储 构造函数 charAt函数 equals函数 hashCode函数 indexOf函数 intern函数 本系列是Java详解,专栏地址:Java源码分析 Str ...

  9. Java源码详解五:ArrayList源码分析--openjdk java 11源码

    文章目录 注释 类的继承与实现 构造函数 add操作 扩容函数 remove函数 subList函数 总结 本系列是Java详解,专栏地址:Java源码分析 ArrayList 官方文档:ArrayL ...

最新文章

  1. 在唯一密钥属性“name”设置为“Application”时,无法添加类型为“add”的重复集合项...
  2. IBM AIX服务器分区之间迁移IO设备以迁移HBA卡为例
  3. jQuery Validate 合法性,限制性校验
  4. Android 实现切换主题皮肤功能(类似于众多app中的 夜间模式,主题包等)
  5. linux数据包注释,关于 linux中TCP数据包(SKB)序列号的小笔记
  6. c语言std变量,10-C ++中的变量
  7. (转)XP和Scrum到底有什么区别?
  8. codeforces 690D2 D2. The Wall (medium)(组合数学)
  9. oracle10g最快安装教程,史上最详细Oracle 10g安装教程
  10. kux格式怎么转换成mp3_kux格式怎么转换成mp4?快速转换格式的方法
  11. 【1】星空派GD32F303开发板介绍
  12. 移动设备管理的具体措施有哪些?(下)
  13. U盘修复“系统找不到指定文件”问题记录
  14. python中全局变量和局部变量关键字_Python中都全局变量和局部变量
  15. excel中统计某个字符的数量
  16. python入门ppt下载_Python3入门ppt
  17. PhysX APEX Clothing中Clothing碰撞体(shape clothing)的使用
  18. 什么是面向对象?谈谈你的理解?
  19. CVE-2019-8451: Jira SSRF
  20. 前端实现街道地图_HTML5实现地图上定位导航路线-前端H5/JS/CSS-敏捷大拇指-一个敢保留真话的IT精英社区...

热门文章

  1. 保持稳定情绪,做好工作:应对压力的策略和技巧
  2. 大地女神该亚与第一代天神乌拉诺斯
  3. Headed-Span-Based Projective Dependency Parsing
  4. 定点运算——位移运算
  5. 快速为mysql创造100万假数据
  6. torch.gather()总结
  7. NX二次开发 UFUN获得对象所在部件tag UF_OBJ_ask_owning_part
  8. (人机对战)原创棋类小游戏OOXX(与五子棋有些许类似)
  9. vue3+element-plus实现日历组件农历显示且带列表数据
  10. ubuntu16.04删除用户及用户目录(高效方法)