设计模式的艺术 行为型模式之备忘录模式
前言
每个人都会有后悔的时候,可是人生没有后悔药,做过的事情无法再去后悔,软件设计中却是有这么一种后悔机制,叫做备忘录模式,它就是软件中的"后悔药"
什么是备忘录模式 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() + "行。");}
}
转载请注明出处,掌声送给社会人
设计模式的艺术 行为型模式之备忘录模式相关推荐
- 设计模式 行为型模式 实例 -- 备忘录模式实例:游戏备忘录
01:设计模式 行为型模式 – 备忘录模式(定义.结构.优缺点 适用场景分析) 02:设计模式 行为型模式 – 备忘录模式 具体实例:游戏挑战BOSS 03:设计模式 行为型模式 实例 – 备忘录模式 ...
- Java实现二十三种设计模式(五)—— 十一种行为型模式 (中)——解释器模式、迭代器模式、中介者模式、备忘录模式
Java实现二十三种设计模式(五)-- 十一种行为型模式 (中)--解释器模式.迭代器模式.中介者模式.备忘录模式 一.解释器模式 我国 IT 界历来有一个汉语编程梦,虽然各方对于汉语编程争论不休,甚 ...
- 设计模式之观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式
前言 这是设计模式的最后一章,包含了剩余的 行为型模式 中的 观察者模式.中介者模式.迭代器模式.访问者模式.备忘录模式.解释器模式 系列文章 第一章:7种设计原则之单一职责原则.接口隔离原则.依赖倒 ...
- 设计模式(模板模式,命令模式,备忘录模式)
目录 模板模式 什么是模板模式? 术语? 什么时候使用模板模式? 模板模式的优点? 模板模式的缺点? 角色? 钩子函数? 注意事项和细节? 什么场景使用模板模式? 案例: 命令模式 什么是命令模式? ...
- 设计模式自学笔记007_Real(命令模式、备忘录模式、桥接模式)
设计模式自学笔记007_Real(命令模式.备忘录模式.桥接模式) 一.命令模式 在软件设计的过程中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道请求的操作是哪个.我们只需要 ...
- 23种设计模式C++源码与UML实现--备忘录模式
备忘录模式 Memento模式也叫备忘录模式,是行为模式之一,它的作用是保存对象内部状态,并在需要的时候(undo/roback)回复对象以前的状态. 应用场景 如果一个对象需要保存状态,并通过und ...
- 设计模式19——行为型模式之备忘录模式
定义:备忘录模式(MementoPattern),在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 类型:对象行为型模式. 概述 ...
- 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)
一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...
- 设计模式(行为型模式)——备忘录模式(Memento)
2019独角兽企业重金招聘Python工程师标准>>> 本章讲讲第三类和第四类. 备忘录模式(Memento) 主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫 ...
最新文章
- C#中base关键字的几种用法
- 最小生成树(MST)
- OpenDocument Format ODF
- Google Earth 6 Beta版发布 (供下载地址)
- gradle-4.10.2-all等gradle下载
- Python开发制作酷狗和QQ音乐下载器
- 下载并安装WIN7 SP2的官方补丁包
- 华为U2000网管研究实录 (3) - 运行分析(服务端进程)
- solidworks工程图模板为什么不能存为slddrt格式
- 投影仪融合、拼接处理系统
- 作为一个面试官如何准备一场面试
- 斑马打印机 ZPL打印
- 切片函数python_python切片操作
- 使用 Python 和 Pygame 构建小行星游戏
- Niushop单商户V4稳定版重构上新啦!
- 什么是WMS系统,WMS如何选型
- android获取键盘状态,Android获取屏幕方向及键盘状态的小例子
- 计算机少年宫辅导教师总结,学校信息技术教师的个人工作总结
- android之broadcastreceiver 耳机按键,Android BroadcastReceiver 实时监听耳机拔出事件
- 读书笔记-->《精益数据分析》第二部分 | 第15章:创业阶段2——黏性