备忘录模式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. 浅析CopyOnWriteArrayList

    CopyOnWriteArrayList引入 模拟传统的ArrayList出现线程不安全的现象 public class Demo1 { public static void main(String[ ...

  2. [Laravel框架学习一]:Laravel框架的安装以及 Composer的安装

    1.先下载Composer-Setup.exe,下载地址:下载Composer .会自动搜索PHP.exe的安装路径,如果没有,就手动找到php路径下的php.exe. 2.在PHP目录下,打开php ...

  3. Centos8安装Docker提示:package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed

    Centos8安装Docker提示:package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but ...

  4. 集合-ArrayList 源码解析

    ArrayList是一种以数组实现的List,与数组相比,它具有动态扩展的能力,因此也可称之为动态数组. 类图 ArrayList实现了List, RandomAccess, Cloneable, j ...

  5. spark2.4.5计算框架中各模块的常用实例

    本项目是使用scala语言给出了spark2.4.5计算框架中各模块的常用实例. 温馨提醒:spark的版本与scala的版本号有严格的对应关系,安装请注意. Spark Core RDD以及Pair ...

  6. CountDownLatch/CyclicBarrier/Semaphore

    CountDownLatch 概念 让一些线程阻塞直到另一些线程完成一系列操作才被唤醒 CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,调用线程就会被阻塞.其它线程调 ...

  7. php 对象的调用和引入

    直接上实例: 定义: <?php namespace app\php; class a { ; public function index() { echo "; } static f ...

  8. (第五篇)Linux操作系统基本结构介绍

    Linux操作系统基本结构介绍 Linux系统一般有4个主要部分:内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用 ...

  9. Cannot find libcrypto in Ubuntu

    https://stackoverflow.com/questions/13811889/cannot-find-libcrypto-in-ubuntu sudo apt-get install li ...

  10. vue项目中使用bpmn-为节点添加颜色

    内容概述 本系列 “vue项目中使用bpmn-xxxx” 分为五篇,均为自己使用过程中用到的实例,手工原创,目前属于陆续更新中.主要包括vue项目中bpmn使用实例.应用技巧.基本知识点总结和需要注意 ...