《一天聊一个设计模式》备忘录

备忘录(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

9. 策略&#xff08;Strategy&#xff09; Intent 定义一系列算法&#xff0c;封装每个算法&#xff0c;并使它们可以互换。 策略模式可以让算法独立于使用它的客户端。 Class Diagram Strategy 接口定义了一个算法族&#xff0c;它们都实现了 behavior() 方法。Context 是…

如何在eclipse jee中创建Maven project并且转换为Dynamic web project

转自&#xff1a;http://www.javaniu.com/maven-jee-dynamic-web-project.htm 注意:该文档只针对以下eclipse版本&#xff0c;如图 一.在eclipse的官方站点下载eclipse jee版本,地址http://www.eclipse.org/downloads/download.php?file/technology/epp/downloads/release/ind…

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

4. 抽象工厂&#xff08;Abstract Factory&#xff09; Intent 提供一个接口&#xff0c;用于创建 相关的对象家族 。 Class Diagram 抽象工厂模式创建的是对象家族&#xff0c;也就是很多对象而不是一个对象&#xff0c;并且这些对象是相关的&#xff0c;也就是说必须一起…

leetcode1047. 删除字符串中的所有相邻重复项(栈的日常应用)

给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 示例&#xff1a; 输入&#xf…

算法题的输入大总结

赶紧收藏吧&#xff0c;小白必备知识了 本文以求和为例 多组输入&#xff0c;每组输入共一行&#xff0c;包括两个整数A, B Sample Input 1 2 12 24 400 500 Sample Output 3 36 900 import java.util.Scanner; public class Main {public static void main(String[] args) …

精华Java问题总结

当时在网上汇总了不知多少面试和基础题&#xff0c;弄了个精华总结。 1、一个".java"源文件中是否可以包括多个类&#xff08;不是内部类&#xff09;&#xff1f;有什么限制&#xff1f; 可以有多个类&#xff0c;但只能有一个public的类&#xff0c;并且public的类…

复习Java的精华总结

小白和老手都应该看看的总结 输入 java.util.Scanner 是 Java5 的新特征&#xff0c;我们可以通过 Scanner 类来获取用户的输入。 下面是创建 Scanner 对象的基本语法&#xff1a; Scanner s new Scanner(System.in); 使用方法如下&#xff1a; //对应类型用对应的方法接…

必须知道的python专属骚技巧25例

本文我总结了25个python专属骚操作&#xff0c;实属提高效率/同事吹牛只利器&#xff0c;确定不收藏吗&#xff1f; 一、原地交换 Python 提供了一个直观的在一行代码中赋值与交换&#xff08;变量值&#xff09;的方法 x, y 10, 20 print(x, y)x, y y, x print(x, y)#1 (10…

Oracle10g数据库的完全卸载:

卸载Oracle &#xff1a; 1、停止所有Oracle服务&#xff0c;点Universal Installer卸载2、删除注册表中的所有关于Oracle项&#xff08;1&#xff09;在HKEY_LOCAL_MACHINE\SOFTWARE下&#xff0c;删除Oracle目录&#xff08;2&#xff09;在HKEY_LOCAL_MACHINE\SYSTEM\Contro…

超硬核!躺进BAT以后我总结了出现最多的15道数组题

作为一个硬核作者&#xff0c;绝不和你扯废话&#xff0c;干货无套路送你 题目一&#xff1a; 给定一个数组arr&#xff0c;求出需要排序的最短子数组长度 要求&#xff1a; 时间o(n),空间o(1) 思路&#xff1a; 有序的数组中&#xff0c;任意一个数字&#xff0c;一定小于左…

《关于我的那些面经》滴滴Java岗(附答案)

手撕单例模式 所谓单例&#xff0c;就是整个程序有且仅有一个实例。该类负责创建自己的对象&#xff0c;同时确保只有一个对象被创建。 在Java&#xff0c;一般常用在工具类的实现或创建对象需要消耗资源。特点&#xff1a;类构造器私有、持有自己类型的属性、对外提供获取实…

《关于我的那些面经》——百度后端(附答案)

作者保证&#xff0c;本系列全是纯干货真实记录&#xff0c;绝对不是某些营销号瞎编乱造的面试。 一、公司的简介 百度是全球最大的中文搜索引擎&#xff0c;是中国最大的以信息和知识为核心的互联网综合服务公司&#xff0c;更是全球领先的人工智能平台型公司。2000年1月1日创…

《兔兔公司的历史》那些年,百度的荣耀和沉沦

这是全站最硬核的兔子700文章后的第一篇软文&#xff0c;觉得喜欢的同学可以三连一波&#xff0c;如果大家喜欢&#xff0c;我会出公司的历史系列、互联网大佬系列、产品经理系列&#xff0c;大家喜欢哪个呢&#xff1f; 百度公司的发展趋势 还记得南宋词人辛弃疾的那首词吗&a…

这篇不讨好任何人的回忆录,记录了我从双非学校到BAT/TMD六offer的原因

注&#xff1a;给我想个新名字好不好呀&#xff0c;采用了直接发百元红包&#xff01;没别的&#xff0c;想让大家认识兔兔rabbit&#xff0c;说一下自己的经验教训&#xff0c;应该会对很多人有帮助。 一、前言 在今年&#xff0c;我要毕业了&#xff0c;基本结束了大学生活&…

如何把maven项目转成web项目

创建Web工程&#xff0c;使用eclipse ee创建maven web工程 1.右键项目,选择Project Facets,点击Convert to faceted from 2.更改Dynamic Web Module的Version为2.5.(3.0为Java7的,Tomcat6不支持). 如果提示错误,可能需要在Java Compiler设置Compiler compliance level 为1.6 …

《兔子的大厂面经合集》朋友面神策数据库,第五个问题不会,直接再见(1)

这个系列计划收集几百份朋友和读者的面经&#xff0c;作者合集方便查看&#xff0c;各位有面经屯着可以联系我哦 写数据库还真不是人人都能干的&#xff0c;硬是一道别的题都没问。

老师给的硬核移动端测试面试题目,大家看看靠谱吗

以后我把各岗位的题目更新个遍&#xff0c;当然大部分都是我自己总结的保证质量哈 ADB工作原理 当用户启动一个adb客户端&#xff0c;客户端首先确认是否已有一个adb服务进程在运行。如果没有&#xff0c;则启动服务进程。当服务器运行&#xff0c; adb服务器就会绑定本地的TC…

兔子,撒币

作为最硬核的你兔老大&#xff0c;我狠起来连自己都骂 一、原力第一 哈哈当然不是骂自己啦哈哈&#xff0c;其实是最近csdn出了一个活动&#xff1a;原力计划s3&#xff0c;弄得我现在整天想着&#xff0c;给你们发钱。发书。发资料。 对&#xff0c;就是这个玩意&#xff1a…

超硬核!数据库学霸笔记,考试/面试随便秒杀

废话不多说&#xff0c;上干货是兔老大的传统了&#xff0c;收藏就完事了。 目录 数据库系统概论 四个基本概念 数据模型 数据库系统结构 数据库系统模式的概念 数据库系统的三级模式结构 数据库的二级映像功能与数据的独立性 数据库系统的组成 关系 关系模式 关系数…

一个神奇的大学科目《软件工程》,知识点总结+测试题,包你不挂科

谁能告诉我这科的理论在哪可以实用呀&#xff1f;搞不懂&#xff0c;只能收藏一下包不挂科 知识点总结 第一章&#xff1a; 软件工程定义&#xff1a; 1968年10月&#xff0c;Fritz Bauer 首次提出了“软件工程”的概念&#xff0c;并将“软件工程”定义为&#xff1a;为了经…