文章目录

  • 二十四、备忘录设计模式
    • 24.1 备忘录设计模式简介
      • 24.1.1 备忘录设计模式概述
      • 24.1.2 备忘录设计模式的UML类图
    • 24.2. 备忘录设计模式的实现
    • 24.3 备忘录设计模式的优缺点

二十四、备忘录设计模式

24.1 备忘录设计模式简介

24.1.1 备忘录设计模式概述

备忘录设计模式(Memento Pattern):又称快照模式(Snapshot Pattern),在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。

备忘录模式提供了一种状态恢复的实现机制,它通过存储系统各个历史状态的快照,使得在任何一时刻都可以将系统回退到某一个历史状态;

【场景举例】

备忘录在我们生活中很容易遇见

  • 例1:例如我们打一些单机游戏的时候,游戏会提供一些存档功能,我们可以选择存档,下次就可以接着这个存档继续玩游戏了;也可以将当前的游戏状态回退到历史的某一个存档;
  • 例2:我们使用的VM虚拟机里面就很好的运用到了“备忘录设计模式”,在使用VM时,可以针对某个操作拍下快照,以防以后误操作时还可以回退到这个状态;

上述都是“备忘录设计模式”的应用场景

24.1.2 备忘录设计模式的UML类图

备忘录设计模式主要有3个角色:

  • 1)发起人角色(Originator):负责读取备忘录角色的信息生成一个状态,或者读取管理角色的备忘录信息来回滚到某个状态;
  • 2)备忘录角色(Memento):用于存储备忘录的一些具体信息,如要将什么信息交给发起人(Originator)保存;
  • 3)管理者角色(Caretaker):对备忘录的管理,如存储一个备忘录、读取从历史存档中读取一个备忘录等,提供备忘录的存储;

24.2. 备忘录设计模式的实现

【案例】

提供游戏的存档功能、回档功能等;

下面我们使用备忘录设计模式来实现案例功能;

  • 1)定义备忘录角色(Memento):
package com.pattern.demo01;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @author lscl* @version 1.0* @intro: 游戏存档(备忘录角色)*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GameMemento {// 游戏等级private String level;// 游戏金币private String money;// 游戏关卡private String gamePlan;
}
  • 2)定义发起人角色(Originator):
package com.pattern.demo01;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @author lscl* @version 1.0* @intro: 游戏类(发起人角色)*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GamePlayOriginator {// 游戏等级private String level;// 游戏金币private String money;// 游戏关卡private String gamePlan;// 查看当前游戏进度详情public void showGameData() {System.out.println("游戏等级【" + level + "】," +"游戏金币【" + money + "】," +"游戏关卡【" + gamePlan + "】");System.out.println("----------------------");}// 保存游戏存档public GameMemento saveGameMemento() {GameMemento gameMemento = new GameMemento(level, money, gamePlan);return gameMemento;}// 回退到历史存档public void backGameMemento(GameMemento gameMemento) {this.level = gameMemento.getLevel();this.money = gameMemento.getMoney();this.gamePlan = gameMemento.getGamePlan();}
}
  • 3)提供备忘录管理员角色(Caretaker):
package com.pattern.demo01;import java.util.HashMap;/*** @author lscl* @version 1.0* @intro: 游戏存档管理,提供存档恢复功能(备忘录管理员角色)*/
public class GameCaretaker {// 保存多次状态private HashMap<String,GameMemento> mementoMaps=new HashMap<>();// 获取存档public GameMemento getMemento(String key) {return mementoMaps.get(key);}// 存入存档public void setMemento(String key,GameMemento memento) {mementoMaps.put(key,memento);}
}
  • 4)测试类:
package com.pattern.demo01;/*** @author lscl* @version 1.0* @intro:*/
public class Demo01 {// 保存多个进度public static void main(String[] args) {// 开始游戏GamePlayOriginator gamePlayOriginator = new GamePlayOriginator();gamePlayOriginator.setMoney("2000$");gamePlayOriginator.setGamePlan("第五关");gamePlayOriginator.setLevel("Lv15");// 查看游戏进度详情gamePlayOriginator.showGameData();// 生成存档GameMemento gameMemento = gamePlayOriginator.saveGameMemento();// 保存存档GameCaretaker gameCaretaker=new GameCaretaker();gameCaretaker.setMemento("1",gameMemento);gamePlayOriginator.setMoney("7000$");gamePlayOriginator.setGamePlan("第九关");gamePlayOriginator.setLevel("Lv18");// 查看游戏进度详情gamePlayOriginator.showGameData();// 18级的存档GameMemento memento18 = gamePlayOriginator.saveGameMemento();gameCaretaker.setMemento("2",memento18);gamePlayOriginator.setMoney("12000$");gamePlayOriginator.setGamePlan("第十五关");gamePlayOriginator.setLevel("Lv27");// 查看游戏进度详情gamePlayOriginator.showGameData();// 获取"1"的存档GameMemento memento = gameCaretaker.getMemento("1");// 回退到"1"的存档gamePlayOriginator.backGameMemento(memento);// 查看游戏进度详情gamePlayOriginator.showGameData();}
}

运行效果:

24.3 备忘录设计模式的优缺点

  • 优点

    • 1)提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。
    • 2)简化发起人的职责,隔离状态与存档、回档,实现信息的封装,客户端无需关系状态的保存细节
  • 缺点:
    • 1)备忘录设计模式的主要缺点就是消耗资源,如果需要保存的状态过多,则每一次保存都会消耗很多内存

24【备忘录设计模式】相关推荐

  1. Python七大原则,24种设计模式

    七大设计原则: 1.单一职责原则[SINGLE RESPONSIBILITY PRINCIPLE]:一个类负责一项职责.  2.里氏替换原则[LISKOV SUBSTITUTION PRINCIPLE ...

  2. DP:***24种设计模式--转自刘伟

    转自于高人的文章:http://blog.csdn.net/lovelion/article/details/17517213 2012年-2013年,Sunny在CSDN技术博客中陆续发表了100多 ...

  3. [转自左潇龙的博客]设计模式大杂烩(24种设计模式的总结以及学习设计模式的几点建议)...

    原文地址:    https://www.cnblogs.com/zuoxiaolong/p/pattern26.html 作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本 ...

  4. 设计模式大杂烩(24种设计模式的总结及学习设计模式的几点建议)

    设计模式大杂烩(24种设计模式的总结及学习设计模式的几点建议)模式分类 & 传送门 & 对比维度说明 设计原则: 设计模式(总纲) 创建型: 单例模式 简单工厂模式 工厂方法模式 抽象 ...

  5. 超简易复制Model对象(为后续备忘录设计模式博文做铺垫)

    超简易复制Model对象(为后续备忘录设计模式博文做铺垫) 复制整个Model需要实现NSCopy协议,可以想象是非常麻烦的一件事情,今天我跟大家分享一个不需要你做任何操作的复制Model对象的方法, ...

  6. 24种设计模式(一)

    24种设计模式 第1章 简单工厂 第2章 外观模式 第3章 适配器模式 第4章 单例模式 第5章 工厂方法模式 第6章 抽象工厂模式 第7章 生成器模式 第8章 原型模式 第9章 中介者模式 第10章 ...

  7. 24种设计模式之单例模式

    24种设计模式之单例模式  一.核心作用: 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. 二.常见的应用场景: 1.Windows的Task Manager(任务管理器)就是很典型的单 ...

  8. 隐藏在《王者荣耀》中程序24种设计模式

    当你还是一个码农的时候,每天都要编写多少行代码每次都要创建很多类的时候,每建立一次给你一点经验值,累计到十级的时候会发现我写了这很多代码为什么不能复用呢? 这时恭喜您进入转职阶段,由码农转成会放魔法的 ...

  9. 备忘录模式 命令模式_备忘录设计模式示例

    备忘录模式 命令模式 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重 ...

最新文章

  1. 数组的遍历你都会用了,那Promise版本的呢
  2. 如何查看方法在哪里被调用
  3. 如何在Node JS中卸载NPM模块?
  4. C#的控件输入法变换
  5. 基于遗传算法优化的BP神经网络的 非线性函数拟合
  6. tf keras SimpleRNN源码解析
  7. C++学习笔记(八)——内联函数
  8. 工厂好的html页面,jquery中被誉为工厂函数的是什么?
  9. 下载国外网站资料需java_Java开发必知道的国外10大网站
  10. 数据结构之基于Java的二叉树实现
  11. GoogleAnalytics文档
  12. InletexEMC共享Windows屏幕的永久免费软件
  13. 小心!使用网页版的WhatsApp时,请选择隐私模式
  14. 优雅的创建一个相册管理类(兼容AssetsLibrary和PhotoKit)
  15. semi-frequent
  16. 表示物体容量的量词有哪些?
  17. 基于决策树算法的银行营销预测
  18. Mathcad的数组使用
  19. 洛谷 P5266 【深基17.例6】学籍管理
  20. 单元测试 chapter3

热门文章

  1. php redis hash删除key,如何优雅的删除Redis的大key
  2. bzoj1070: [SCOI2007]修车-费用流
  3. ESP8266 连接手提电脑创建的TCP服务器不成功
  4. 关于沙漠君 | 一只特立独行的猪
  5. Enhancing Text-based Reinforcement Learning Agentswith Commonsense Knowledge
  6. 【干货贴】当人工智能与艺术碰撞 | AI写诗
  7. SimCSE 对比学习句向量
  8. java byte数组转int数组_Java任意长度byte数组转换为int数组的方法
  9. oracle update indexs,update global indexes的online的程度研究
  10. IOS 中微信 网页授权报 key[也就是code]失效 解决办法