备忘录模式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. 漫谈LiteOS-Huawei_IoT_Link_SDK_OTA 开发指导

    1概述 在应用升级过程中,无线下载更新(OTA)是一种常用,且方便的升级方式.Liteos采用的OTA升级方案基于LwM2M协议,实现了固件升级(FOTA)和软件升级(SOTA)两种升级方案.用户可根 ...

  2. Django系列操作

    每次用到都去百度找....找的还不行~~得自己改~~耗时耗力虽然不难~~~直接贴代码记录下方便自己用~~~~ Django之分页 定义成一个块,直接引用到对应的位置即可... <div clas ...

  3. linux 文件的查找和压缩

    1.使用 locate 命令 需要安装:yum install mlocate -y 创建或更新 slocate/locate 命令所必需的数据库文件:updatedb 作用:搜索不经常改变的文件如配 ...

  4. 最新版navicat 12.1 破解(Keygen注册机)

    最新注册机链接:https://pan.baidu.com/s/1fFCRkkXMzk6CFpbttCDr7w   提取码:40xo 1.下载安装Navicat 在Navicat关闭的情况下运行注册机 ...

  5. 2019-2020-1 20199326《Linux内核原理与分析》第六周作业

    本周学习了庖丁解牛Linux内核分析第五章:系统调用的三层机制(下),是上一章的延续 实验内容:使用gdb跟踪分析一个系统调用内核函数 上周实验我选择的getpid这个系统系统调用,这次准备使用gdb ...

  6. SQLI-LABS学习笔记(三)

    第十一关   这一关是POST注入   先利用bp抓包抓到post传输的参数数据     抓到传递的表单为   uname=admin&passwd=admin&submit=Subm ...

  7. 2019-2020-1 20199328《Linux内核原理与分析》第五周作业

    实验要求: 实验步骤: 这里以20号系统调用getpid为例进行实验,该函数的功能为:返回当前进程标识. getpid.c代码: 查看实验结果: 当前进程pid为:31042. 在C语言中编入汇编代码 ...

  8. Eclipse Mac OS 安装 Subversion插件subclipse 缺失JavaHL解决方案

    安装 SVN 插件 subclipse 时可能遇到问题 subclipse 安装完成后,当我们选择使用 的时候还是会提示:javaHL not available, SVN接口选择 client:选择 ...

  9. 如何设计高并发web应用

      所谓高并发,就是同一时间有很多流量(通常指用户)访问程序的接口.页面及其他资源,解决高并发就是当流量峰值到来时保证程序的稳定性. 我们一般用QPS(每秒查询数,又叫每秒请求数)来衡量程序的综合性能 ...

  10. “Too many texture interpolators would be used for ForwardBase pass”

    CGPROGRAM 下加一个 #pragma target 4.0 转载于:https://www.cnblogs.com/alps/p/7101092.html