一、备忘录模式概述

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

  结构:

    (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. 转载:【Oracle 集群】RAC知识图文详细教程(六)--RAC在LINUX上使用NFS安装前准备

    文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...

  2. LeetCode OJ:Number of 1 Bits(比特1的位数)

    Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also know ...

  3. 自定义控件-滑动条SeekBar

    一.效果图 二.实现思路 1.控件继承自View 2.重写两个方法onDraw() 绘制页面和 onTouch() 添加监听 3.onDraw(Canvas ca)中     a.new Canvas ...

  4. Falsk项目cookie中的 csrf_token 和表单中的 csrf_token实现

    Flask中请求体的请求开启CSRF保护可以按以下配置 from flask_wtf.csrf import CSRFProtect app.config.from_object(Config) CS ...

  5. Linux下系统的定时及延时任务

    一.系统的延时 是临时的.对系统做的任务指定一个时间点.发起的命令是at at    时间点(now+1min)      ## 设定任务实行时间 at>  执行命令               ...

  6. flowable IdmEngine和IdmEngineConfiguration

    IdmEngineConfiguration 继承了 AbstractEngineConfiguration. 一.创建EngineConfiguration实例 IdmEngineConfigura ...

  7. JavaScript动态加载js文件

    /********************************************************************* * JavaScript动态加载js文件 * 说明: * ...

  8. .net core web 中使用app.UseRouter的几种使用方式

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory ...

  9. HDU1575 Tr A

    解题思路:矩阵快速幂模板题,见代码: #include<cstdio> #include<cstring> #include<algorithm> using na ...

  10. 类(Classes)

    待写! 这里极力推荐博客园Vamei写的python系列文章,非常精彩,我只是遵照着The Python Tutorial目录来记录自己的学习体会,但也在看Vamei的文章,给大家推荐! 作者:Vam ...