前言

每个人都会有后悔的时候,可是人生没有后悔药,做过的事情无法再去后悔,软件设计中却是有这么一种后悔机制,叫做备忘录模式,它就是软件中的"后悔药"

什么是备忘录模式  Memento Pattern

在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态,这样可以将对象恢复到原先保存的状态,它是一种对象行为型模式,有个别名叫做Token

备忘录模式的优点

(1)、它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储的备忘录将状态复原

(2)、备忘录实现了对信息的封装,一个备忘录对象是一种原发器对象状态的表示,不会被其他代码所改动,备忘录保存了原发器的状态,采用列表,堆栈等集合来存储备忘录对象可以实现多次撤销操作。

备忘录模式的主要缺点

资源消耗过大,如果需要保存的原发器类的成员变量太多,就不可避免地需要占用大量的存储空间,每保存一次对象的状态都需要消耗一定的系统资源。

备忘录模式的适用场景

(1)、保存一个对象在某一个时刻的全部状态或部分状态,这样以后需要时就能恢复到先前的状态,实现撤销操作

(2)、防止外界对象破坏一个对象历史状态的封装性,避免将对象历史状态的实现细节暴露给外界对象

备忘录模式的具体实现

目录结构

原发器

package com.company;//象棋棋子类:原发器
public class Chessman {private  String label;private int x;private int y;public Chessman(String label, int x, int y) {this.label = label;this.x = x;this.y = y;}//保存状态public ChessmanMemento save(){return  new ChessmanMemento(this.label,this.x,this.y);}//恢复状态public void restore(ChessmanMemento memento){this.label=memento.getLabel();this.y=memento.getY();this.x=memento.getX();}public String getLabel() {return label;}public void setLabel(String label) {this.label = label;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}
}

备忘录

package com.company;//棋子备忘录
public class ChessmanMemento {private  String label;private int x;private int y;public ChessmanMemento(String label, int x, int y) {this.label = label;this.x = x;this.y = y;}public String getLabel() {return label;}public void setLabel(String label) {this.label = label;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}
}

备忘录管理类

package com.company;import java.util.ArrayList;//象棋棋子备忘录管理类:负责人
public class MementoCaretaker {
/*    private ChessmanMemento memento;public ChessmanMemento getMemento() {return memento;}public void setMemento(ChessmanMemento memento) {this.memento = memento;}*/
//定义一个集合来存储多个备忘录private ArrayList mementoList=new ArrayList();public ChessmanMemento getMemento(int i) {return (ChessmanMemento) mementoList.get(i);}public void setMemento(ChessmanMemento memento) {mementoList.add(memento);}
}

测试类

package com.company;public class Client {private static int index = -1;  //定义一个索引来记录当前状态所在的位置private static MementoCaretaker mc = new MementoCaretaker();public static void main(String[] args) {Chessman chess = new Chessman("车", 1, 1);display(chess);chess.setX(4);display(chess);chess.setX(5);display(chess);undo(chess, index);undo(chess, index);redo(chess, index);redo(chess, index);}//撤销悔棋private static void redo(Chessman chess, int index) {System.out.println("撤销悔棋");index++;chess.restore(mc.getMemento(index+1));  //恢复到下一个备忘录System.out.println("棋子" + chess.getLabel() + "当前位置为:" + "第" + chess.getX() + "行" + "第" + chess.getY() + "行。");}//悔棋private static void undo(Chessman chess, int index) {System.out.println("悔棋");index--;chess.restore(mc.getMemento(index-1));  //撤销到上个备忘录System.out.println("棋子" + chess.getLabel() + "当前位置为:" + "第" + chess.getX() + "行" + "第" + chess.getY() + "行。");}private static void display(Chessman chess) {mc.setMemento(chess.save());  //保存在备忘录index++;System.out.println("棋子" + chess.getLabel() + "当前位置为:" + "第" + chess.getX() + "行" + "第" + chess.getY() + "行。");}
}

转载请注明出处,掌声送给社会人

设计模式的艺术 行为型模式之备忘录模式相关推荐

  1. 设计模式 行为型模式 实例 -- 备忘录模式实例:游戏备忘录

    01:设计模式 行为型模式 – 备忘录模式(定义.结构.优缺点 适用场景分析) 02:设计模式 行为型模式 – 备忘录模式 具体实例:游戏挑战BOSS 03:设计模式 行为型模式 实例 – 备忘录模式 ...

  2. Java实现二十三种设计模式(五)—— 十一种行为型模式 (中)——解释器模式、迭代器模式、中介者模式、备忘录模式

    Java实现二十三种设计模式(五)-- 十一种行为型模式 (中)--解释器模式.迭代器模式.中介者模式.备忘录模式 一.解释器模式 我国 IT 界历来有一个汉语编程梦,虽然各方对于汉语编程争论不休,甚 ...

  3. 设计模式之观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式

    前言 这是设计模式的最后一章,包含了剩余的 行为型模式 中的 观察者模式.中介者模式.迭代器模式.访问者模式.备忘录模式.解释器模式 系列文章 第一章:7种设计原则之单一职责原则.接口隔离原则.依赖倒 ...

  4. 设计模式(模板模式,命令模式,备忘录模式)

    目录 模板模式 什么是模板模式? 术语? 什么时候使用模板模式? 模板模式的优点? 模板模式的缺点? 角色? 钩子函数? 注意事项和细节? 什么场景使用模板模式? 案例: 命令模式 什么是命令模式? ...

  5. 设计模式自学笔记007_Real(命令模式、备忘录模式、桥接模式)

    设计模式自学笔记007_Real(命令模式.备忘录模式.桥接模式) 一.命令模式 在软件设计的过程中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道请求的操作是哪个.我们只需要 ...

  6. 23种设计模式C++源码与UML实现--备忘录模式

    备忘录模式 Memento模式也叫备忘录模式,是行为模式之一,它的作用是保存对象内部状态,并在需要的时候(undo/roback)回复对象以前的状态. 应用场景 如果一个对象需要保存状态,并通过und ...

  7. 设计模式19——行为型模式之备忘录模式

     定义:备忘录模式(MementoPattern),在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 类型:对象行为型模式. 概述 ...

  8. 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)

    一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...

  9. 设计模式(行为型模式)——备忘录模式(Memento)

    2019独角兽企业重金招聘Python工程师标准>>> 本章讲讲第三类和第四类. 备忘录模式(Memento) 主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫 ...

最新文章

  1. C#中base关键字的几种用法
  2. 最小生成树(MST)
  3. OpenDocument Format ODF
  4. Google Earth 6 Beta版发布 (供下载地址)
  5. gradle-4.10.2-all等gradle下载
  6. Python开发制作酷狗和QQ音乐下载器
  7. 下载并安装WIN7 SP2的官方补丁包
  8. 华为U2000网管研究实录 (3) - 运行分析(服务端进程)
  9. solidworks工程图模板为什么不能存为slddrt格式
  10. 投影仪融合、拼接处理系统
  11. 作为一个面试官如何准备一场面试
  12. 斑马打印机 ZPL打印
  13. 切片函数python_python切片操作
  14. 使用 Python 和 Pygame 构建小行星游戏
  15. Niushop单商户V4稳定版重构上新啦!
  16. 什么是WMS系统,WMS如何选型
  17. android获取键盘状态,Android获取屏幕方向及键盘状态的小例子
  18. 计算机少年宫辅导教师总结,学校信息技术教师的个人工作总结
  19. android之broadcastreceiver 耳机按键,Android BroadcastReceiver 实时监听耳机拔出事件
  20. 读书笔记-->《精益数据分析》第二部分 | 第15章:创业阶段2——黏性

热门文章

  1. 基于区块链的供应链金融服务平台
  2. Recovery刷机图文教程
  3. 数字化转型时代 百年品牌OKI是如何跟进的?
  4. WPF RichTextBox·绑定数据
  5. C语言程序设计 详细注意事项
  6. 关于口头语和书面语的区别
  7. 51单片机按键亮灯汇编,作者刚刚开始学习汇编
  8. wps怎么改格式html,wps如何修改默认格式
  9. css display属性及使用方法
  10. python两个乘号什么意思_python两个乘号_关于Python中*号的用法