设计模式——Memento(备忘录)模式
目录
- 前言
- 1 定义
- 2 适用情况
- 3 结构
- 3.1 结构图
- 3.2 参与者
- 4 应用举例
- 4.1 Memento和MementoCare
- 4.2 Orginator——UrlEntity
- 4.3 Client——ClientTest
- 5 总结
- 参考文献
前言
有时有必要记录一个对象的内部状态,以方便用户从错误中恢复过来。比如访问浏览器要求实现后退和撤销功能等。
1 定义
Memento(备忘录)模式:在不破坏封装性前提下,获取对象内部状态并外部保存,以方便日后恢复对象状态。
2 适用情况
- 当需要保存一个对象的内部状态,以方便后续在用户出错时进行恢复。
- 如果一个接口让其它对象直接获取内部状态,又要不破坏对象的封装性。
3 结构
3.1 结构图
Memento备忘录模式结构图:
3.2 参与者
- Memento:备忘录,备份Orginator的内部state,在需要时根据备忘录进行恢复。
- Orginator:原发器,用于创建备忘录,在需要时恢复状态。
- CareTaker:存储备忘录,可以根据原发器需要进行恢复和撤销操作等。
4 应用举例
自定义浏览器撤销,恢复操作。
4.1 Memento和MementoCare
定义如下:
@Data
public class MementoCare {/*** 维护访问历史*/static List<Memento> history = new ArrayList<>();/*** 当前的访问索引*/static volatile int cursor = -1;static void addMemento(Memento memento) {history.add(memento);cursor++;}static Memento restoreMemento() {cursor--;if (cusor>history.size()) {return history.get(history.size()-1);}return history.get(cursor);}static Memento undoMemento() {cursor++;if (cusor>history.size()) {return history.get(history.size()-1);}return history.get(cursor);}/*** 维护一个内部静态类记录浏览记录和名称*/@Data@AllArgsConstructor@NoArgsConstructorstatic class Memento {private String url;private String name;}
}
维护备忘录列表,定义恢复和撤销操作。
4.2 Orginator——UrlEntity
定义如下:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UrlEntity {private String url;private String name;public void createMemento(){MementoCare.addMemento(new MementoCare.Memento(url, name));}public void restoreMemento() {MementoCare.Memento memento = MementoCare.restoreMemento();setUrl(memento.getUrl());setName(memento.getName());}public void undoMemento() {MementoCare.Memento memento = MementoCare.undoMemento();setUrl(memento.getUrl());setName(memento.getName());}public void printVisit() {String context = "你正在访问:" + name + "——" + url;System.out.println(context);}
}
定义创建备忘录操作,调用MementoCare处理恢复和撤销操作。
4.3 Client——ClientTest
测试如下:
public class ClientTest {public static void main(String[] args) {UrlEntity urlEntity = new UrlEntity("www.baidu.com", "百度");urlEntity.printVisit();urlEntity.createMemento();urlEntity.setUrl("www.google.com");urlEntity.setName("谷歌");urlEntity.printVisit();urlEntity.createMemento();urlEntity.setUrl("www.alipay.com");urlEntity.setName("支付宝");urlEntity.printVisit();urlEntity.createMemento();System.out.println("********恢复上次浏览*******");urlEntity.restoreMemento();urlEntity.printVisit();System.out.println("********恢复上次浏览*******");urlEntity.restoreMemento();urlEntity.printVisit();System.out.println("********撤销操作*******");urlEntity.undoMemento();urlEntity.printVisit();System.out.println("********撤销操作*******");urlEntity.undoMemento();urlEntity.printVisit();}
}
运行结果:
5 总结
当需要保存对象内部状态,并在需要时恢复和撤销操作,可以使用备忘录模式。
参考文献
[1]. 《设计模式》
设计模式——Memento(备忘录)模式相关推荐
- 设计模式之备忘录模式(Memento)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 设计模式学习笔记--Memento 备忘录模式
在软件的构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前某个点时的状态,如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现. 如何实现 ...
- java备忘录模式应用场景_图解Java设计模式之备忘录模式
图解Java设计模式之备忘录模式 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态. ...
- Alamps学习设计模式之备忘录模式(笑话:劫个色OR抢个鸡蛋版)
//设计模式之备忘录模式(月光宝盒版),只要喊菠萝菠萝蜜,就能返回事件的原点.//至尊宝//爱你一万年 class LoverWords {// 模拟Memento private Strin ...
- 设计模式之备忘录模式 转载
https://juejin.im/post/59c8eb6951882564c5164c5f 设计模式之备忘录模式 备忘录模式 介绍 是一种行为模式 用于保存对象当前状态,并在之后恢复到此状态(后悔 ...
- java备忘录模式 类图,Android编程设计模式之备忘录模式详解
本文实例讲述了Android编程设计模式之备忘录模式.分享给大家供大家参考,具体如下: 一.介绍 备忘录模式是一种行为模式,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态,这有点像我们平时 ...
- java之备忘录模式,java设计模式之备忘录模式
java设计模式之备忘录模式 代码无错便是优? 简介: 在不破坏封装性的前提下 , 捕获一个对象的内部状态,并在该对象之外保存这个状态 , 这样以后就可以将该对象恢复到原先保存的状态 . 备忘录模式就 ...
- 设计模式:备忘录模式(Memento)
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- 『设计模式』备忘录模式(memento)下象棋,我就想悔棋怎么办
23种设计模式+额外常用设计模式汇总 (持续更新) Memento模式的关键就是要在不破坏封装性的前提下,捕获一个对象的内部状态并在该对象之外保存这个状态.这样以后就可以利用该保存的状态实施恢复操作. ...
最新文章
- 查找运行时间超过1天的frmweb进程
- SWOOLE httpserver
- SpringBoot升级到2.3.x后返回message为空
- 解决Windows 10 CPU占用高风扇吵问题
- Category 中属性的使用
- java 反射深度克隆_C# 使用反射来实现对象的深度复制方法
- php 与结合struts2,Struts2和Ajax数据交互示例详解
- 并不对劲的AC自动机
- matlab里用simulink仿真教程,Matlab-Simulink仿真教程
- ps里面怎么插入流程图_教你如何正确画工艺流程图
- java excel 透视_在Java中用Excel创建数据透视表和数据透视图
- MATLAB中调用eemd函数
- 【Java基础系列教程】第六章 Java面向对象详解(一)_类和类的成员
- 【修真院“纯洁”系列之十九】驱逐令
- 壹度同城新零售系统v4.1.23 社交电商 同城商城
- 2021-05-29当微商怎么引流?微商如何利用闲鱼引流?
- 【火影之卡卡西动漫主题】
- 微信公众号留言功能实现方法分享
- 12306 抢票 python + selenium + chrome (二) 基础准备的软件和材料
- Quora商业模式发展的七种可能性
热门文章
- C语言中typedef void(*F)(类型)解读
- linux下python操作.doc后缀文件
- vbnet 产生 uniqueidentifier类型数据
- sqlyon社区版_SQLyog社区版(SQLyog Community)
- CentOS挂载本地iso文件制作yum源
- 2G内存只有1G可用是什么问题?
- 量化投资学习-38:通过非线性函数的极值看股市的运行规律
- 为什么现在的女孩子结婚都要房要车和高昂的彩礼?
- 网络安全工程师需要学哪些内容?零基础如何从入门到精通,看完这一篇就够了
- JavaSE_第12章 泛型