目录

  • 前言
  • 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(备忘录)模式相关推荐

  1. 设计模式之备忘录模式(Memento)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  2. 设计模式学习笔记--Memento 备忘录模式

    在软件的构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前某个点时的状态,如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现.      如何实现 ...

  3. java备忘录模式应用场景_图解Java设计模式之备忘录模式

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

  4. Alamps学习设计模式之备忘录模式(笑话:劫个色OR抢个鸡蛋版)

    //设计模式之备忘录模式(月光宝盒版),只要喊菠萝菠萝蜜,就能返回事件的原点.//至尊宝//爱你一万年 class LoverWords {// 模拟Memento     private Strin ...

  5. 设计模式之备忘录模式 转载

    https://juejin.im/post/59c8eb6951882564c5164c5f 设计模式之备忘录模式 备忘录模式 介绍 是一种行为模式 用于保存对象当前状态,并在之后恢复到此状态(后悔 ...

  6. java备忘录模式 类图,Android编程设计模式之备忘录模式详解

    本文实例讲述了Android编程设计模式之备忘录模式.分享给大家供大家参考,具体如下: 一.介绍 备忘录模式是一种行为模式,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态,这有点像我们平时 ...

  7. java之备忘录模式,java设计模式之备忘录模式

    java设计模式之备忘录模式 代码无错便是优? 简介: 在不破坏封装性的前提下 , 捕获一个对象的内部状态,并在该对象之外保存这个状态 , 这样以后就可以将该对象恢复到原先保存的状态 . 备忘录模式就 ...

  8. 设计模式:备忘录模式(Memento)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  9. 『设计模式』备忘录模式(memento)下象棋,我就想悔棋怎么办

    23种设计模式+额外常用设计模式汇总 (持续更新) Memento模式的关键就是要在不破坏封装性的前提下,捕获一个对象的内部状态并在该对象之外保存这个状态.这样以后就可以利用该保存的状态实施恢复操作. ...

最新文章

  1. 查找运行时间超过1天的frmweb进程
  2. SWOOLE httpserver
  3. SpringBoot升级到2.3.x后返回message为空
  4. 解决Windows 10 CPU占用高风扇吵问题
  5. Category 中属性的使用
  6. java 反射深度克隆_C# 使用反射来实现对象的深度复制方法
  7. php 与结合struts2,Struts2和Ajax数据交互示例详解
  8. 并不对劲的AC自动机
  9. matlab里用simulink仿真教程,Matlab-Simulink仿真教程
  10. ps里面怎么插入流程图_教你如何正确画工艺流程图
  11. java excel 透视_在Java中用Excel创建数据透视表和数据透视图
  12. MATLAB中调用eemd函数
  13. 【Java基础系列教程】第六章 Java面向对象详解(一)_类和类的成员
  14. 【修真院“纯洁”系列之十九】驱逐令
  15. 壹度同城新零售系统v4.1.23 社交电商 同城商城
  16. 2021-05-29当微商怎么引流?微商如何利用闲鱼引流?
  17. 【火影之卡卡西动漫主题】
  18. 微信公众号留言功能实现方法分享
  19. 12306 抢票 python + selenium + chrome (二) 基础准备的软件和材料
  20. Quora商业模式发展的七种可能性

热门文章

  1. C语言中typedef void(*F)(类型)解读
  2. linux下python操作.doc后缀文件
  3. vbnet 产生 uniqueidentifier类型数据
  4. sqlyon社区版_SQLyog社区版(SQLyog Community)
  5. CentOS挂载本地iso文件制作yum源
  6. 2G内存只有1G可用是什么问题?
  7. 量化投资学习-38:通过非线性函数的极值看股市的运行规律
  8. 为什么现在的女孩子结婚都要房要车和高昂的彩礼?
  9. 网络安全工程师需要学哪些内容?零基础如何从入门到精通,看完这一篇就够了
  10. JavaSE_第12章 泛型