备忘录(Memento)

Intent

在不违反封装的情况下获得对象的内部状态,从而在需要时可以将对象恢复到最初状态。

Class Diagram

  • Originator:原始对象
  • Caretaker:负责保存好备忘录
  • Memento:备忘录,存储原始对象的的状态。备忘录实际上有两个接口,一个是提供给 Caretaker 的窄接口:它只能将备忘录传递给其它对象;一个是提供给 Originator 的宽接口,允许它访问到先前状态所需的所有数据。理想情况是只允许 Originator 访问本备忘录的内部状态。

Implementation

以下实现了一个简单计算器程序,可以输入两个值,然后计算这两个值的和。备忘录模式允许将这两个值存储起来,然后在某个时刻用存储的状态进行恢复。

实现参考:Memento Pattern - Calculator Example - Java Sourcecode

/*** Originator Interface*/
public interface Calculator {// Create MementoPreviousCalculationToCareTaker backupLastCalculation();// setMementovoid restorePreviousCalculation(PreviousCalculationToCareTaker memento);int getCalculationResult();void setFirstNumber(int firstNumber);void setSecondNumber(int secondNumber);
}
/*** Originator Implementation*/
public class CalculatorImp implements Calculator {private int firstNumber;private int secondNumber;@Overridepublic PreviousCalculationToCareTaker backupLastCalculation() {// create a memento object used for restoring two numbersreturn new PreviousCalculationImp(firstNumber, secondNumber);}@Overridepublic void restorePreviousCalculation(PreviousCalculationToCareTaker memento) {this.firstNumber = ((PreviousCalculationToOriginator) memento).getFirstNumber();this.secondNumber = ((PreviousCalculationToOriginator) memento).getSecondNumber();}@Overridepublic int getCalculationResult() {// result is adding two numbersreturn firstNumber + secondNumber;}@Overridepublic void setFirstNumber(int firstNumber) {this.firstNumber = firstNumber;}@Overridepublic void setSecondNumber(int secondNumber) {this.secondNumber = secondNumber;}
}
/*** Memento Interface to Originator** This interface allows the originator to restore its state*/
public interface PreviousCalculationToOriginator {int getFirstNumber();int getSecondNumber();
}
/***  Memento interface to CalculatorOperator (Caretaker)*/
public interface PreviousCalculationToCareTaker {// no operations permitted for the caretaker
}
/*** Memento Object Implementation* <p>* Note that this object implements both interfaces to Originator and CareTaker*/
public class PreviousCalculationImp implements PreviousCalculationToCareTaker,PreviousCalculationToOriginator {private int firstNumber;private int secondNumber;public PreviousCalculationImp(int firstNumber, int secondNumber) {this.firstNumber = firstNumber;this.secondNumber = secondNumber;}@Overridepublic int getFirstNumber() {return firstNumber;}@Overridepublic int getSecondNumber() {return secondNumber;}
}
/*** CareTaker object*/
public class Client {public static void main(String[] args) {// program startsCalculator calculator = new CalculatorImp();// assume user enters two numberscalculator.setFirstNumber(10);calculator.setSecondNumber(100);// find resultSystem.out.println(calculator.getCalculationResult());// Store result of this calculation in case of errorPreviousCalculationToCareTaker memento = calculator.backupLastCalculation();// user enters a numbercalculator.setFirstNumber(17);// user enters a wrong second number and calculates resultcalculator.setSecondNumber(-290);// calculate resultSystem.out.println(calculator.getCalculationResult());// user hits CTRL + Z to undo last operation and see last resultcalculator.restorePreviousCalculation(memento);// result restoredSystem.out.println(calculator.getCalculationResult());}
}
110
-273
110

JDK

  • java.io.Serializable

《一天聊一个设计模式》备忘录相关推荐

  1. 《一天聊一个设计模式》 抽象工厂

    4. 抽象工厂(Abstract Factory) Intent 提供一个接口,用于创建 相关的对象家族 . Class Diagram 抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并 ...

  2. 《一天聊一个设计模式》 策略

    9. 策略(Strategy) Intent 定义一系列算法,封装每个算法,并使它们可以互换. 策略模式可以让算法独立于使用它的客户端. Class Diagram Strategy 接口定义了一个算 ...

  3. 《一天聊一个设计模式》 单例

    我是兔兔rabbit,关注我吧,给自己每天的进步找一个机会和理由,不要被无效信息淹没 单例(Singleton) Intent 确保一个类只有一个实例,并提供该实例的全局访问点. Class Diag ...

  4. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  5. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  6. 大话设计模式—备忘录模式

    备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式.所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保 ...

  7. 听飞狐聊JavaScript设计模式系列07

    本回内容介绍 上一回聊到JS单例模式(singleton),做了一道题,内容不多,比较容易理解. 介一回嘞,聊聊工厂模式,之前聊到过工厂模式,这回聊深入点儿,可能会比较抽象,不过好在实际开发中使用还算 ...

  8. 听飞狐聊JavaScript设计模式系列05

    本回内容介绍 上一回聊到JS的类的模拟,继承,分析了nodejs,extjs,jquery,underscore的继承源码. 介一回,偶们来聊一下在JS中模拟接口,掺元类,装饰者模式,有些盆友可能用过 ...

  9. Java设计模式——备忘录模式

    Java设计模式--备忘录模式 需求 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状 ...

最新文章

  1. TokuDB vs Innodb 基准测试对比
  2. LeetCode Contains Duplicate
  3. Python 网络爬虫笔记2 -- Requests库实战
  4. Python | 基于参数和返回值的功能分类
  5. 新手关于如何看编程经典书的一些疑惑?
  6. 使用find 命令执行命令 -exec
  7. 高精除(信息学奥赛一本通-T1308)
  8. linux浮动ip添加 手动,在Linux 双机下自己手动实现浮动ip技术
  9. 转载--Python random模块(获取随机数)常用方法和使用例子
  10. java导出excel_Java导出excel【复制粘贴直接用】
  11. 三、数学建模之灰色关联分析【清风数学建模个人笔记】
  12. Windows 7 旗舰版 64位 (纯净版)
  13. ffmpeg开发打印音视频meta信息
  14. 苹果手机上的计算机恢复出厂设置在哪里,苹果手机怎么还原出厂设置【详解】...
  15. 配置华为防火墙接口IP地址和区域
  16. C++小系统——餐馆员工管理系统及餐馆点菜系统(一)
  17. 披上了SSL战甲的HTTP战士——HTTPS
  18. RF在智能座舱测试中的应用
  19. Win10备份错误代码0x800700e1怎么解决?
  20. 科普:QUIC协议原理分析

热门文章

  1. UE4 左右立体参数
  2. Linux Kbuild文档 3
  3. python中回车怎么表示_如何在python中使用读取行仅拆分回车符?
  4. C#容量超出了最大容量。
  5. 【转】ubuntu16.04安装配置tftp服务
  6. 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 2
  7. C# 有什么惊艳到你的地方?
  8. python settings模块导入不了_python settings 中通过字符串导入模块
  9. Python 数据分析三剑客之 Pandas(十):数据读写
  10. PWN-PRACTICE-CTFSHOW-1