设计模式之备忘录设计模式

  • 备忘录设计模式(Memento Pattern)

    • 在不破坏封闭的前提下,捕获一个对象的内部状态,保存对象的某个状态,以便在适当的时候恢复对象,又叫做快照模式,属于行为模式
    • 备忘录模式实现的方式需要保证被保存的对象状态不能被对象从外部访问
  • 应用场景

    • 玩游戏存档功能,下一次登录游戏时可以从上次退出的地方继续游戏
    • 棋盘类游戏的悔棋
    • 数据库事务回滚
    • 需要记录一个对象的内部状态时,为了允许用户取消不确定或者错误的操作,能够恢复到原先的状态
    • 提供一个可回滚的操作,如Ctrl+Z、浏览器回退按钮
  • 角色

    • Originator发起者:记录当前的内部状态,并负责创建和恢复备忘录数据,允许访问返回到先前状态所需的所有数据,可以根据需要决定Memento存储自己的哪些内部状态

    • Memento备忘录:负责存储Originator发起人对象的内部状态,在需要的时候提供发起人需要的内部状态

    • Caretaker管理者:对备忘录进行管理、保存和提供备忘录,只能将备忘录传递给其他角色

    • Originator和Memento属性类似

      在这里插入图片描述

  • 代码示例,以游戏存档、回退为例

    /*** 发起者*/
    class RoleOriginator {// 生命值private int hp = 100;// 攻击力private int attack = 10;public int getHp() {return hp;}public void setHp(int hp) {this.hp = hp;}public int getAttack() {return attack;}public void setAttack(int attack) {this.attack = attack;}public void display() {System.out.println("生命:" + hp + ",攻击力:" + attack);}public void fight() {// 攻击力上涨this.attack += 2;// 生命值下降this.hp -= 10;System.out.println("战斗了一次");}/*** 存档:保存快照** @return*/public RoleStateMemento saveState() {System.out.println("存档成功");return new RoleStateMemento(hp, attack);}/*** 恢复存档** @param memento*/public void recoveryState(RoleStateMemento memento) {this.hp = memento.getHp();this.attack = memento.getAttack();System.out.println("恢复存档成功");}
    }/*** 备忘录、快照*/
    class RoleStateMemento {// 生命值private int hp;// 攻击力private int attack;public RoleStateMemento(int hp, int attack) {this.hp = hp;this.attack = attack;}public int getHp() {return hp;}public void setHp(int hp) {this.hp = hp;}public int getAttack() {return attack;}public void setAttack(int attack) {this.attack = attack;}
    }/*** 状态管理者*/
    class RoleStateCaretaker {private RoleStateMemento memento;public RoleStateMemento getMemento() {return memento;}public void setMemento(RoleStateMemento memento) {this.memento = memento;}
    }public class Main {public static void main(String[] args) {RoleOriginator roleOriginator = new RoleOriginator();roleOriginator.display();roleOriginator.fight();roleOriginator.display();// 存档RoleStateCaretaker caretaker = new RoleStateCaretaker();caretaker.setMemento(roleOriginator.saveState());roleOriginator.fight();roleOriginator.fight();roleOriginator.fight();roleOriginator.display();// 恢复存档roleOriginator.recoveryState(caretaker.getMemento());roleOriginator.display();}
    }
    
  • 优点

    • 给用户提供了一种可以恢复状态的机制
    • 实现了信息的封装,使得用户不需要关心状态的保存细节
  • 缺点

    • 消耗更多的资源,而且每一次保存都会消耗一定的内存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/73438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytest 框架学习总结

视频:pytest01-快速上手_哔哩哔哩_bilibili 资料:pytest 框架 - 白月黑羽 基于 Python 语言的自动化测试框架 最知名的 有如下 3 款unittest、pytest、robotframework 前两款框架主要(或者说很大程度上)是 聚焦 在 白盒单元测试…

Day16:最小的k个数

仓库管理员以数组 stock 形式记录商品库存表,其中 stock[i] 表示对应商品库存余量。请返回库存余量最少的 cnt 个商品余量,返回 顺序不限。 示例 1: 输入:stock [2,5,7,4], cnt 1 输出:[2]示例 2: 输入…

【最后203篇系列】016 Q201架构思考

前言 Q200已经达到了我既定的目标,在最近的3个月,我需要进一步完善,达到可以试产的程度。 在这个过程当中,许多知识和体会一直在变。 qtv200到目前,虽然通过习惯(每晚运行离线策略和比对)方式维持了注意力的集中&…

音视频入门基础:RTP专题(20)——通过FFprobe显示RTP流每个packet的信息

通过FFprobe命令: ffprobe -protocol_whitelist "file,rtp,udp" -of json -show_packets XXX.sdp 可以显示SDP描述的RTP流每个packet(数据包)的信息: 对于RTP流,上述的“packet”(数据包&#…

信息系统运行管理员教程6--信息系统安全

信息系统运行管理员教程6–信息系统安全 第1节 信息系统安全概述 1.信息系统安全的概念 信息系统安全是指保障计算机及其相关设备、设施(含网络)的安全,运行环境的安全,信息的安全,实现信息系统的正常运行。信息系统…

LLM后训练:解锁大型语言模型推理能力的关键路径

引言:从语言生成到逻辑推理的跃迁 大型语言模型(LLMs)通过预训练掌握了海量语言模式,但其核心缺陷——幻觉、逻辑断裂、价值观偏差——暴露了单纯预训练的局限性。后训练(Post-Training)作为预训练后的精修…

9.贪心算法

简单贪心 1.P10452 货仓选址 - 洛谷 #include<iostream> #include<algorithm> using namespace std;typedef long long LL; const int N 1e510; LL a[N]; LL n;int main() {cin>>n;for(int i 1;i < n;i)cin>>a[i];sort(a1,a1n);//排序 LL sum 0…

Linux 网络:skb 数据管理

文章目录 1. 前言2. skb 数据管理2.1 初始化2.2 数据的插入2.2.1 在头部插入数据2.2.2 在尾部插入数据 2.2 数据的移除 3. 小结 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. skb 数据管理 数…

批量给 Excel 添加或删除密码保护|Excel 批量设置打开密码和只读密码

我们在将 Excel 文档发送给第三方或者进行存档的时候&#xff0c;对 Excel 文档添加密码保护是非常重要的一个操作。添加保护后的 Excel 文档。就只能有相应权限的用户才能够打开或者编辑操作。尤其是当我们 Excel 文档中内容非常敏感非常重要的时候&#xff0c;添加保护就显得…

蓝耘MaaS平台:阿里QWQ应用拓展与调参实践

摘要&#xff1a;本文深入探讨了蓝耘MaaS平台与阿里QWQ模型的结合&#xff0c;从平台架构、模型特点到应用拓展和调参实践进行了全面分析。蓝耘平台凭借其强大的算力支持、弹性资源调度和全栈服务&#xff0c;为QWQ模型的高效部署提供了理想环境。通过细化语义描述、调整推理参…

使用 Docker 部署前端项目全攻略

文章目录 1. Docker 基础概念1.1 核心组件1.2 Docker 工作流程 2. 环境准备2.1 安装 Docker2.2 验证安装 3. 项目配置3.1 项目结构3.2 创建 Dockerfile 4. 构建与运行4.1 构建镜像4.2 运行容器4.3 访问应用 5. 使用 Docker Compose5.1 创建 docker-compose.yml5.2 启动服务5.3 …

Vue中使用到的padStart方法是什么

padStart() 是 JavaScript 字符串对象的一个方法&#xff0c;用于在字符串的开头填充指定的字符&#xff0c;直到字符串达到指定的长度。这在需要对字符串进行格式化&#xff0c;使其保持固定长度时非常有用&#xff0c;比如在日期格式化时&#xff0c;确保月份、日期等为两位数…

springboot集成flink实现DM数据库同步到ES

前言 今天分享的其实是一个面试上机方案&#xff0c;就是监测DM数据库数据&#xff0c;同步到ES&#xff0c;使用flink实现。基本套路&#xff0c;其实也没啥好说的&#xff0c;非要说也就是&#xff0c;国家队还是很多不跟你玩啊&#xff0c;虽然flink有阿里在背后&#xff0c…

springboot jackson 日期格式配置

一、JacksonProperties JacksonProperties是一个用ConfigurationProperties(prefix“spring.jackson”)注解修饰的类&#xff0c;所以可以通过以spring.jackson为前缀的配置去赋值。 JacksonAutoConfiguration会通过Jackson2ObjectMapperBuilderCustomizer实现类根据JacksonPr…

【蓝桥杯】24省赛:数字串个数

思路 本质是组合数学问题&#xff1a; 9个数字组成10000位数字有9**10000可能 不包括3的可能8**10000 不包括7的可能8**10000 既不包括3也不包括77**10000 根据容斥原理&#xff1a;结果为 9 ∗ ∗ 10000 − 8 ∗ ∗ 10000 − 8 ∗ ∗ 10000 7 ∗ ∗ 10000 9**10000 - 8**10…

AGI大模型(7):提示词应用

1 生成数据 LLM具有⽣成连贯⽂本的强⼤能⼒。使⽤有效的提示策略可以引导模型产⽣更好、更⼀致和更真实的响应。LLMs还可以特别有⽤地⽣成数据,这对于运⾏各种实验和评估⾮常有⽤。例如,我们可以使⽤它来为情感分类器⽣成快速样本,如下所示: 提示: ⽣成10个情感分析的范…

Unity开发中对象池设计与使用

一、设计目的 为了避免频繁创建和销毁对象&#xff08;例如 UI 元素、事件对象等&#xff09;带来的内存分配和垃圾回收压力&#xff0c;可以使用对象池来管理对象来提高游戏的性能&#xff0c;避免游戏卡顿。 二、代码实现 public interface IRecycle {/// <summary>…

JVM并发编程AQSsync锁ReentrantLock线程池ThreadLocal

并发编程2 synchronized锁实现**AQS****ReentrantLock实现****JUC 常用类**池的概念 ThreadLocalThreadLocal原理内存泄露强引用:软引用弱引用虚引用ThreadLocal内存泄露 synchronized锁实现 synchronized是一个关键字,实现同步,还需要我们提供一个同步锁对象,记录锁状态,记录…

【JavaEE】网络原理之初识

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

操作系统-八股

进程基础&#xff1a; 进程定义&#xff1a;运行中的程序&#xff0c;有独立的内存空间和地址&#xff0c;是系统进行资源调度和分配的基本单位。 并发&#xff0c;并行 并发就是单核上面轮询&#xff0c;并行就是同时执行&#xff08;多核&#xff09;&#xff1b; 进程上下…