当前位置: 首页 > news >正文

设计模式-行为型模式-备忘录模式

1.备忘录模式定义

        在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态;

1.1 备忘录模式的优缺点

优点

  • 提供了一种状态恢复的实现机制,使得用户可以方便的回到一个特定的历史步骤,当新的状态无效或者存在问题的时候,可以使用暂时存储起来的备忘录将状态恢复;
  • 备忘录实现了对信息的封装,一个备忘录对象是一种发起者对象状态的表示,不会被其他代码所改动;

缺点

  • 资源消耗过大,如果需要保存的发起者类的成员变量比较多,就不可避免的需要占用大量的存储空间,每保存一次对象的状态都需要消耗一定的系统资源;

1.2 备忘录模式的使用场景

  • 需要保存一个对象在某一时刻的状态时,可以使用备忘录模式;
  • 不希望外界直接访问对象内部状态时;

2.备忘录模式的原理

  • 发起人(Originator):状态需要被记录的元对象类,记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,它可以访问备忘录里的所有信息;
  • 备忘录(Memento):负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人;
  • 看护人(Caretaker):对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改;

3.备忘录模式的实现

【实例】

        一个简单的吃金币的游戏,玩家通过掷骰子来决定下一状态,点数为1、3、5时金币增加对应数,点数为2、4、6时玩家减少对应金币,当金币为小于等于0时游戏重新开始;

【代码】

        备忘录:记录玩家的状态

public class Memento {int money;    //所持金钱//构造函数Memento(int money) {this.money = money;this.fruits = new ArrayList();}//获取当前玩家所有的金钱int getMoney() {return money;}
}

        发起人——玩家

public class Player {private int money;      //所持金钱private Random random = new Random();   //随机数对象//构造方法public Player(int money) {this.money = money;}//获取当前所持有的金钱public int getMoney() {return money;}//掷骰子游戏public void yacht(){int dice = random.nextInt(6) + 1;   //掷骰子switch(dice){case 1:case 3:case 5:money += dice;break;case 2:case 4:case 6:money -= dice;break;default:break;}}//拍摄快照public Memento createMemento(){Memento memento = new Memento(money);return memento;}//撤销方法public void restore(Memento memento){this.money = memento.money;}@Overridepublic String toString() {return "Player{" +"money=" + money +'}';}
}

        看护人——客户端

public class MainApp {public static void main(String[] args) throws InterruptedException {Player player = new Player(100);        //最初所持的金钱数Memento memento = player.createMemento();       //保存最初状态for (int i = 0; i < 100; i++) {//显示扔骰子的次数System.out.println("=====" + i);//显示当前状态System.out.println("当前状态: " + player);//开启游戏player.yacht();System.out.println("所持有的金钱为: " + player.getMoney() + " 元");//决定如何操作Mementoif(player.getMoney() > 0){System.out.println("赚到金币,保存当前状态,继续游戏!");memento = player.createMemento();}else {System.out.println("所持金币不足,游戏重新开始!");player.restore(memento);}Thread.sleep(1000);System.out.println("");}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Vue3如何查看项目是否安装了vue-router路由依赖,及安装方法
  • 数据结构与算法-17高级数据结构_图论(迪杰斯特拉算法)
  • 《黑神话:悟空》本地存档误删了怎么恢复?三种方法!
  • PHP7 json_encode() 浮点小数溢出错误
  • 攻防世界 ics-05
  • 【原创】java+swing+mysql项目管理系统设计与实现
  • OPENAIGC开发者大赛高校组银奖 | LonAC中小学编程学习平台
  • 借助MoAiStudio不写一行代码,完成页面开发
  • Redis的IO模型
  • 如何使用UWA Gears连接模拟器进行性能测试
  • Spring部分常见面试题
  • 记录k8s重启之后kubelet无法启动的问题
  • 数据库的实施过程分析
  • jeecg的单点登录
  • 如何使用YOLOv5进行物体检测,并通过GraspNet进行6D位姿估计,从而实现机械臂的抓取规划
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • canvas 绘制双线技巧
  • CentOS 7 修改主机名
  • ES6核心特性
  • MySQL用户中的%到底包不包括localhost?
  • vagrant 添加本地 box 安装 laravel homestead
  • Vue 2.3、2.4 知识点小结
  • 测试开发系类之接口自动化测试
  • 大主子表关联的性能优化方法
  • 分享一份非常强势的Android面试题
  • 浅谈Golang中select的用法
  • 一起参Ember.js讨论、问答社区。
  • 用jQuery怎么做到前后端分离
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #{}和${}的区别?
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #数学建模# 线性规划问题的Matlab求解
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (Java数据结构)ArrayList
  • (JS基础)String 类型
  • (附源码)springboot教学评价 毕业设计 641310
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (十六)串口UART
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (一)认识微服务
  • (转)大型网站的系统架构
  • ***通过什么方式***网吧
  • .Net MVC4 上传大文件,并保存表单
  • .net 生成二级域名
  • .Net 中Partitioner static与dynamic的性能对比
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • /3GB和/USERVA开关
  • @RequestMapping处理请求异常
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [BZOJ 3680]吊打XXX(模拟退火)
  • [C++]入门基础(1)