24【备忘录设计模式】
文章目录
- 二十四、备忘录设计模式
- 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【备忘录设计模式】相关推荐
- Python七大原则,24种设计模式
七大设计原则: 1.单一职责原则[SINGLE RESPONSIBILITY PRINCIPLE]:一个类负责一项职责. 2.里氏替换原则[LISKOV SUBSTITUTION PRINCIPLE ...
- DP:***24种设计模式--转自刘伟
转自于高人的文章:http://blog.csdn.net/lovelion/article/details/17517213 2012年-2013年,Sunny在CSDN技术博客中陆续发表了100多 ...
- [转自左潇龙的博客]设计模式大杂烩(24种设计模式的总结以及学习设计模式的几点建议)...
原文地址: https://www.cnblogs.com/zuoxiaolong/p/pattern26.html 作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本 ...
- 设计模式大杂烩(24种设计模式的总结及学习设计模式的几点建议)
设计模式大杂烩(24种设计模式的总结及学习设计模式的几点建议)模式分类 & 传送门 & 对比维度说明 设计原则: 设计模式(总纲) 创建型: 单例模式 简单工厂模式 工厂方法模式 抽象 ...
- 超简易复制Model对象(为后续备忘录设计模式博文做铺垫)
超简易复制Model对象(为后续备忘录设计模式博文做铺垫) 复制整个Model需要实现NSCopy协议,可以想象是非常麻烦的一件事情,今天我跟大家分享一个不需要你做任何操作的复制Model对象的方法, ...
- 24种设计模式(一)
24种设计模式 第1章 简单工厂 第2章 外观模式 第3章 适配器模式 第4章 单例模式 第5章 工厂方法模式 第6章 抽象工厂模式 第7章 生成器模式 第8章 原型模式 第9章 中介者模式 第10章 ...
- 24种设计模式之单例模式
24种设计模式之单例模式 一.核心作用: 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. 二.常见的应用场景: 1.Windows的Task Manager(任务管理器)就是很典型的单 ...
- 隐藏在《王者荣耀》中程序24种设计模式
当你还是一个码农的时候,每天都要编写多少行代码每次都要创建很多类的时候,每建立一次给你一点经验值,累计到十级的时候会发现我写了这很多代码为什么不能复用呢? 这时恭喜您进入转职阶段,由码农转成会放魔法的 ...
- 备忘录模式 命令模式_备忘录设计模式示例
备忘录模式 命令模式 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重 ...
最新文章
- 数组的遍历你都会用了,那Promise版本的呢
- 如何查看方法在哪里被调用
- 如何在Node JS中卸载NPM模块?
- C#的控件输入法变换
- 基于遗传算法优化的BP神经网络的 非线性函数拟合
- tf keras SimpleRNN源码解析
- C++学习笔记(八)——内联函数
- 工厂好的html页面,jquery中被誉为工厂函数的是什么?
- 下载国外网站资料需java_Java开发必知道的国外10大网站
- 数据结构之基于Java的二叉树实现
- GoogleAnalytics文档
- InletexEMC共享Windows屏幕的永久免费软件
- 小心!使用网页版的WhatsApp时,请选择隐私模式
- 优雅的创建一个相册管理类(兼容AssetsLibrary和PhotoKit)
- semi-frequent
- 表示物体容量的量词有哪些?
- 基于决策树算法的银行营销预测
- Mathcad的数组使用
- 洛谷 P5266 【深基17.例6】学籍管理
- 单元测试 chapter3
热门文章
- php redis hash删除key,如何优雅的删除Redis的大key
- bzoj1070: [SCOI2007]修车-费用流
- ESP8266 连接手提电脑创建的TCP服务器不成功
- 关于沙漠君 | 一只特立独行的猪
- Enhancing Text-based Reinforcement Learning Agentswith Commonsense Knowledge
- 【干货贴】当人工智能与艺术碰撞 | AI写诗
- SimCSE 对比学习句向量
- java byte数组转int数组_Java任意长度byte数组转换为int数组的方法
- oracle update indexs,update global indexes的online的程度研究
- IOS 中微信 网页授权报 key[也就是code]失效 解决办法