一、备忘录模式概述

  保存某个对象内部状态的拷贝,使得以后就可以将该对象恢复到原先的状态。

  结构:

    (1)源发器类 Originator

        负责创建一个备忘录 Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。

    (2)备忘录类 Memento

        负责存储 Originator 对象的内部状态,并可防止 Originator 以外的其他对象访问备忘录 Memento 。

    (3)负责人类 CareTake

        负责保存备忘录 Memento 。

二、备忘录模式示例代码

 /**
* 备忘录类
* @author CL
*
*/
public class EmpMemento {
private String name;
private int age;
private double salary; public EmpMemento(Employee emp) {
this.name = emp.getName();
this.age = emp.getAge();
this.salary = emp.getSalary();
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} 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;
} }
 /**
* 源发器类
* @author CL
*
*/
public class Employee {
private String name;
private int age;
private double salary; public Employee(String name, int age, double salary) {
this.name = name;
this.age = age;
this.salary = salary;
} /**
* 进行备忘操作,并返回备忘录对象
* @return
*/
public EmpMemento memento() {
return new EmpMemento(this);
} /**
* 进行数据恢复,恢复成指定备忘录对象的值
*/
public void recovery(EmpMemento emt) {
this.name = emt.getName();
this.age = emt.getAge();
this.salary = emt.getSalary();
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} 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;
} }
 /**
* 负责人类
* @author CL
*
*/
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;
} }

  测试:

 /**
* 测试备忘录模式
* @author CL
*
*/
public class Client { public static void main(String[] args) {
CareTaker ct = new CareTaker(); Employee emp = new Employee("曹磊", 23, 8000);
System.out.println("第一次打印对象:"+emp.getName()+"---"+emp.getAge()
+"---"+emp.getSalary()); //备忘一次
ct.setMemento(emp.memento()); //修改源发器类的值
emp.setName("Tom");
emp.setAge(99);
emp.setSalary(123456); System.out.println("第二次打印对象:"+emp.getName()+"---"+emp.getAge()
+"---"+emp.getSalary()); //恢复到备忘录对象保存的状态
emp.recovery(ct.getMemento()); System.out.println("第三次打印对象:"+emp.getName()+"---"+emp.getAge()
+"---"+emp.getSalary()); }
}

  控制台输出:

第一次打印对象:曹磊---23---8000.0
第二次打印对象:Tom---99---123456.0
第三次打印对象:曹磊---23---8000.0

  注意:本例子中只设置了一个备忘点,当通过容器设置多个备忘点时,就可以实现 Word 中 Ctrl + Z 和 Ctrl + Y 的操作。

三、备忘录模式常见开发应用场景

  (1)棋类游戏中的悔棋操作;

  (2)Office 中的撤销、恢复功能;

  (3)数据库软件中事务管理的回滚操作;

  (4)Photoshop 软件中的历史记录;

  (5)…………

GOF23设计模式之备忘录模式(memento)的更多相关文章

  1. 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)

    原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...

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

    备忘录模式(Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. Originator(发起人):负责创建一个备忘录 ...

  3. 二十四种设计模式:备忘录模式(Memento Pattern)

    备忘录模式(Memento Pattern) 介绍在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例有一个Message实体类,某 ...

  4. 【GOF23设计模式】备忘录模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_备忘录模式.多点备忘.事务操作.回滚数据底层架构 package com.test.memento; /** * 源发器类 ...

  5. [设计模式] 18 备忘录模式Memento Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存 ...

  6. 【设计模式】—— 备忘录模式Memento

    前言:[模式总览]——————————by xingoo 模式意图 这个模式主要是想通过一个对象来记录对象的某种状态,这样有利于在其他需要的场合进行恢复. 该模式还有跟多可以扩展的地方,比如可以记录多 ...

  7. 设计模式 笔记 备忘录模式 Memento

    //---------------------------15/04/27---------------------------- //Memento 备忘录模式----对象行为型模式 /* 1:意图 ...

  8. 行为型设计模式之备忘录模式(Memento)

    结构 意图 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 适用性 必须保存一个对象在某一个时刻的(部分)状态, 这样以后需要时 ...

  9. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento   沿着脚印,走过你来时的路,回到原点.     苦海翻起爱恨   在世间难逃避命运   相亲竟不可接近   或我应该相信是缘份   一首<一生所爱>触动了多少 ...

随机推荐

  1. Markdown_00_资源帖

    一.官方资料 1.原始官方文档 daringfireball.net 2.官方文档中文版 Markdown 语法说明 (简体中文版) Markdown: Basics (快速入门) 3.Typora官 ...

  2. yum 认知及使用

    https://www.cnblogs.com/zhichaoma/p/7533247.html

  3. CUDA库函数module management

    http://horacio9573.no-ip.org/cuda/group__CUDA__MODULE_ga52be009b0d4045811b30c965e1cb2cf.html

  4. WiFi无线网络参数 802.11a/b/g/n 详解

    转载自:WiFi无线网络参数 802.11a/b/g/n 详解 如转载侵犯您的版权,请联系:2378264731@qq.com 802.11a/b/g/n,其实指的是无线网络协议,细分为802.11a ...

  5. 安装Spring报错An error occurred while collecting items to be installed

    原因主要是eclipse和spring版本之间的匹配问题. An error occurred while collecting items to be installed session conte ...

  6. Java数据封装类

    项目中用到,比较好用!! 用户前端与后台的交互数据,这个封装类中包含分页.数据.错误码.状态码等信息!! 亲测好用哦! 一个类DataWrapper public class DataWrapper& ...

  7. 《Tomcat内核设计剖析》勘误表

    <Tomcat内核设计剖析>勘误表 书中第95页图request部分印成了reqiest. 书中第311页两个tomcat3,其中一个应为tomcat4. 书中第5页URL应为URI. 书 ...

  8. OpenFlow技术白皮书-V1.0

    1.  概述 OpenFlow是由斯坦福大学的Nick McKeown教授在2008年4月ACM Communications Review上发表的一篇论文OpenFlow: enabling inn ...

  9. ubuntu创建Centos7镜像&&配置运行环境

    1. 下载centos7镜像 sudo docker pull centos:7 2. 启动centos7容器并挂载本地目录 sudo docker -it -v /home/software:/ho ...

  10. 在tableView中设置cell的图片和文字

    // 设置UITableViewCellEditingStyle的 accessoryType UITableViewCellAccessoryNone,                   // d ...