备忘录模式Memento

场景:

-Word文档编辑时,电脑死机或者断电,再次打开时,word提醒恢复之前的文档

-文件的撤回

核心:

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

结构:
-源发器类Originator(需要备忘的对象,内部可以创建备忘录,用于记录当前时刻它的内部状态,并可使用备忘录回恢复内部状态)

-备忘录类Menmeto9(负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录)

-负责人类CareTaker(负责管理备忘录类)

备忘点较多时:

-将备忘录压栈:

public class CareTaker{

private Memento memento;

private Stack<Memento> stack=new Stack<>();

}

-将多个备忘录对象,序列化和持久化(存在硬盘上)

开发中的场景:

-棋类游戏中,悔棋

-撤销操作

-数据库软件中,事务管理中的回滚操作

-PS中的历史记录

/**
 * 源发器类
 * @author 小帆敲代码
 *
 */
public class Emp {
 private String ename;
 private int age;
 private double salary;
 
 //构建备忘录对象
 public Memento getMemento() {
  return new Memento(this);
 }
 //进行数据恢复,恢复成指定备忘录对象的值
 public void recovery(Memento m) {
  this.setEname(m.getEname());
  this.setAge(m.getAge());
  this.setSalary(m.getSalary());
 }
 
 public Emp(String ename, int age, double salary) {
  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;
 }
}

/**
 * 备忘录
 * @author 小帆敲代码
 *
 */
public class Memento {
 private String ename;
 private int age;
 private double salary;
 
 public Memento(Emp e) {
  this.ename = e.getEname();
  this.age = e.getAge();
  this.salary = e.getSalary();
 }
 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;
 }
 
}

/**
 * 负责人类
 * 负责管理备忘录
 * @author 小帆敲代码
 *
 */
public class CareTaker {
 private Memento mmt;
 //private List<Memento> list=new ArrayList<>();
 
 public CareTaker(Memento mmt) {
  this.mmt = mmt;
 }
 public CareTaker() {
 }
 public Memento getMmt() {
  return mmt;
 }
 public void setMmt(Memento mmt) {
  this.mmt = mmt;
 }
}
public class Client {
  public static void main(String[] args) {
   CareTaker ct= new CareTaker();
   
   Emp e=new Emp("小张",18,10000);
   System.out.println("第一次打印对象:"+e.getEname()+"---"+e.getAge()+"---"+e.getSalary());
   //做备忘
   ct.setMmt(e.getMemento());
   
   e.setAge(30);
   e.setEname("老张");
   e.setSalary(10000000);
   System.out.println("第二次打印对象:"+e.getEname()+"---"+e.getAge()+"---"+e.getSalary());
   
   //恢复
   e.recovery(ct.getMmt());
   System.out.println("第三次打印对象:"+e.getEname()+"---"+e.getAge()+"---"+e.getSalary());
  }
}

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

  1. 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 实现不了是研发的借口? 实现不了,有时候是功能复杂度较高难以实 ...

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

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

  3. Java设计模式学习记录-备忘录模式

    前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...

  4. java设计模式-----21、备忘录模式

    概念: Memento模式也叫备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式,它的作用是保存对象的内部状态,并在需要的时候(u ...

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

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

  6. 大话设计模式Python实现-备忘录模式

    备忘录模式(Memento Pattern):不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样已经后就可将该对象恢复到原先保存的状态 下面是一个备忘录模式的demo: #! ...

  7. C#设计模式系列:备忘录模式(Memento)

    1.备忘录模式简介 1.1>.定义 备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态. 1.2>.使用频率 ...

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

    假如我们已经记录一个人的个人信息,但是发现信息写错了,然后我先备份下再去修改,结果发现原来的信息是正确的,于是我就看备份的个人信息还原到初始的状态,下面我们用代码去实现 class Program { ...

  9. 设计模式のMementoPattern(备忘录模式)----行为模式

    一.产生背景 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. 主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态, ...

随机推荐

  1. 远程登录redis

    没想到吧,我居然已经摸到了redis. 远程登录redis redis-cli -h 127.0.0.1 -p 6379 ip地址和端口记得换成自己的

  2. shiro:入门程序(一)

    SpringMVC项目 1:pom引入相关依赖 <dependencies> <!--测试依赖--> <dependency> <groupId>jun ...

  3. 关于mysql的范式——反范式的思路

    数据库的设计,是有模式的,就是在实际生产的项目中,按照怎样怎样步骤的去做.减少冗余呀,一对多呀等等. 那么回归到一个问题:数据库究竟是为了添加,还是为了查询?这个问题有些轴,以 增删改查四律而言,都是 ...

  4. PE文件学习(2)导入表导出表

    转自:evil.eagle https://blog.csdn.net/evileagle/article/details/12176797 导出表是用来描述模块中的导出函数的结构,如果一个模块导出了 ...

  5. apache虚拟主机配置-域名/IP和端口两种配置

    由于百度上有非常详细的资料,我这里就转载而已:https://jingyan.baidu.com/article/4f7d5712d48a191a201927e0.html

  6. 微信自动关闭内置浏览器页面,返回公众号窗口 WeixinJSBridge.call('closeWindow')

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. Inno Setup 删除文件夹 DelTree

    Pascal Scripting: DelTree Prototype: function DelTree(const Path: String; const IsDir, DeleteFiles, ...

  8. RequestDispatcher.forward() 方法和HttpServletResponse.sendRedirect()方法的区别

    RequestDispatcher.forward() 方法和HttpServletResponse.sendRedirect()方法的区别 先贴一段代码 public void logon(Http ...

  9. Java的循环语句

    一.while 循环 while(循环条件){ 循环操作语句 } * 循环3要素: 变量的初值.变量的判断.变量的更新 * 缺少循环变量的更新,循环将一直进行下去 public class Whlie ...

  10. memcached 原子性操作 CAS模式

    2019独角兽企业重金招聘Python工程师标准>>> 应用场景分析: 如原来MEMCACHED中的KES的内容为A,客户端C1和客户端C2都把A取了出来,C1往准备往其中加B,C2 ...