设计模式——备忘录模式

备忘录模式

  • 备忘录模式是什么?
  • 备忘录模式解决什么问题?
  • 备忘录模式实现

备忘录模式是什么?

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

备忘录模式解决什么问题?

如游戏打Boss失败时回档,定义一个游戏角色


public class GameRole {private int vitality;private int attack;private int defense;public int getVitality() {return vitality;}public void setVitality(int vitality) {this.vitality = vitality;}public int getAttack() {return attack;}public void setAttack(int attack) {this.attack = attack;}public int getDefense() {return defense;}public void setDefense(int defense) {this.defense = defense;}public void displayState() {System.out.println("角色当前状态:");System.out.println("体力:" + vitality);System.out.println("攻击力:" + attack);System.out.println("防御力:" + defense);}public void getInitState() {vitality = 100;attack = 100;defense = 100;}public void fight() {vitality = 0;attack = 0;defense = 0;}
}

在挑战Boss前,复制一份当前的状态

GameRole role = new GameRole();
role.getInitState();
role.displayState();GameRole backup = new GameRole();
backup.setVitality(role.getVitality());
backup.setAttack(role.getAttack());
backup.setDefense(role.getDefense());

当挑战Boss失败后,通过此前的复制还原状态

role.fight();
role.displayState();role.setVitality(backup.getVitality());
role.setAttack(backup.getAttack());
role.setDefense(backup.getDefense());
role.displayState();
  • problem1:需要对属性一个个进行备份
  • problem2:当属性增加或修改时,需要对代码修改

备忘录模式实现

创建备忘录,添加要保存的数据

public class RoleStateMemento {private int vitality;private int attack;private int defense;public RoleStateMemento(int vitality, int attack, int defense) {this.vitality = vitality;this.attack = attack;this.defense = defense;}public int getVitality() {return vitality;}public void setVitality(int vitality) {this.vitality = vitality;}public int getAttack() {return attack;}public void setAttack(int attack) {this.attack = attack;}public int getDefense() {return defense;}public void setDefense(int defense) {this.defense = defense;}
}

修改GameRole类,添加备份/还原方法

public class GameRole {private int vitality;private int attack;private int defense;public int getVitality() {return vitality;}public void setVitality(int vitality) {this.vitality = vitality;}public int getAttack() {return attack;}public void setAttack(int attack) {this.attack = attack;}public int getDefense() {return defense;}public void setDefense(int defense) {this.defense = defense;}public void displayState() {System.out.println("角色当前状态:");System.out.println("体力:" + vitality);System.out.println("攻击力:" + attack);System.out.println("防御力:" + defense);}public void getInitState() {vitality = 100;attack = 100;defense = 100;}public void fight() {vitality = 0;attack = 0;defense = 0;}public RoleStateMemento saveState() {return new RoleStateMemento(vitality, attack, defense);}public void recoveryState(RoleStateMemento memento) {vitality = memento.getVitality();attack = memento.getAttack();defense = memento.getDefense();}
}

创建它们之间的管理类

public class RoleStateCaretaker {private RoleStateMemento mMemento;public RoleStateMemento getMemento() {return mMemento;}public void setMemento(RoleStateMemento memento) {mMemento = memento;}
}

备份/还原代码如下

GameRole role = new GameRole();
role.getInitState();
role.displayState();RoleStateCaretaker stateCaretaker = new RoleStateCaretaker();
stateCaretaker.setMemento(role.saveState());role.fight();
role.displayState();role.recoveryState(stateCaretaker.getMemento());
role.displayState();

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

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

相关文章

java面试题-设计模式基础

面试专题-设计模式 前言 在平时的开发中,涉及到设计模式的有两块内容,第一个是我们平时使用的框架(比如spring、mybatis等),第二个是我们自己开发业务使用的设计模式。 面试官一般比较关心的是你在开发过程中&#…

游戏录屏软件推荐,教你录制高清游戏视频

“有没有好用的游戏录屏软件推荐呀,最近当上了游戏主播,平台要求每天都要发一个游戏视频,可是我的游戏录屏软件太拉胯了,录制出来的视频非常糊,导致平台审核不通过,所以想问问大家有没有游戏录屏软件推荐一…

SQL server 创建存储过程

SQL Server如何创建存储过程 存储过程: 可以理解为完成特定功能的一组 SQL 语句集,存储在数据库中,经过第一次编译,之后的运行不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数…

时序分解 | Matlab实现CEEMD互补集合经验模态分解时间序列信号分解

时序分解 | Matlab实现CEEMD互补集合经验模态分解时间序列信号分解 目录 时序分解 | Matlab实现CEEMD互补集合经验模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现CEEMD互补集合经验模态分解时间序列信号分解 1.分解效果图 &#xff0…

opencv dnn模块 示例(17) 目标检测 object_detection 之 yolo v5

在前文【opencv dnn模块 示例(16) 目标检测 object_detection 之 yolov4】介绍的yolo v4后的2个月,Ultralytics发布了YOLOV5 的第一个正式版本,其性能与YOLO V4不相伯仲。 文章目录 1、Yolo v5 和 Yolo v4 的区别说明1.1、Data Augmentation - 数据增强1…

vue3【echarts 做的词云图】

效果图 安装 安装echarts npm install echarts安装词云图 npm install echarts-wordcloudecharts-wordcloud的git仓库地址 echarts官网地址 引用 import * as ECharts from "echarts"; //引用eacharts import echarts-wordcloud;//引用云词这里的echarts 是自己简…

ViewBinding——Android之视图绑定

高版本的gradle不再支持 kotlin-android-extensions插件,因此view的绑定方式也有所改变。 1.启用视图绑定 android {...viewBinding {enabled true}} 如果想在生成绑定类时忽略某个布局文件,请将 tools:viewBindingIgnore"true" 属性添加到…

PHP8的类与对象的基本操作之类的实例化-PHP8知识详解

定义完类和方法后,并不是真正创建一个对象。类和对象可以描述为如下关系。类用来描述具有相同数据结构和特征的“一组对象”,“类”是“对象”的抽象,而“对象”是“类”的具体实例,即一个类中的对象具有相同的“型”,…

【Solidity】Solidity Keccak256 与 SHA3-256

Solidity Keccak256 与 SHA3-256 文章目录 前言什么是 SHA3Keccak256 和 SHA3-256 有什么区别?为何推出sha3参考区块链的造富神话大家一定都有所耳闻,今天我们讨论以太坊中一项基础技术,主打一个一学就会。 前言 看过以太坊源码或者对区块链有了解的的同学,一定都见过一个…

华为 Mate60 系列全球发布:地表最强黑科技旗舰,打破传统,引领未来!

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

Amazon Lightsail——兼具亚马逊云科技的强大功能与 VPS 的简易性

对于开发者而言,当你想构建系统架构时,你的面前就出现了两种选择,选择一:花时间去亲手挑选每个亚马逊云科技组件(云服务器、存储、IP 地址等),然后自己组装起来;选择二是只需要一个预…

WebGL HUD(平视显示器)

目录 HUD(平视显示器) 如何实现HUD 示例程序(HUD.html) 示例程序(HUD.js) 代码详解 在网页文字上方显示三维物体 代码详解 HUD(平视显示器) 平视显示器(head…

金融业务-房产业务

文章目录 1. 信用贷(Unsecured Loans)2. 交易垫资(Transaction Loans)3. 房产抵押贷款(Mortgage Loans)4. 转贷垫资(Bridge Loans) 金融机构的房贷业务涵盖了多种不同的产品&#xf…

展示日志log4.properties

log4.properties 1.log4.properties 此时文件主要用于展示日志的输出的级别的信息。 # Set root category priority to INFO and its only appender to CONSOLE. #log4j.rootCategoryINFO, CONSOLE debug info warn error fatal log4j.rootCategoryinfo, CONSO…

算法通过村第九关-二分(中序遍历)黄金笔记|二叉搜索树

文章目录 前言1. 有序数组转二叉搜索树2. 寻找连个正序数组的中位数总结 前言 提示:有时候,我感觉自己一辈子活在两个闹钟之间,早上的第一次闹钟,以及5分钟之后的第二次闹钟。 --奥利弗萨克斯《意识的河流》 每个专题都有简单题&a…

数据结构题型9-顺序栈

#include <iostream> //引入头文件 using namespace std;typedef int Elemtype;#define Maxsize 10 #define ERROR 0 #define OK 1typedef struct {Elemtype data[Maxsize];int top; }SqStack;void InitStack(SqStack& S) {S.top -1; } bool StackEmpty(SqStack…

netty快速入门基本用法

1、netty的基本工作流程 在netty中存在以下的核心组件&#xff1a; ServerBootstrap&#xff1a;服务器端启动辅助对象&#xff1b;Bootstrap&#xff1a;客户端启动辅助对象&#xff1b;Channel&#xff1a;通道&#xff0c;代表一个连接&#xff0c;每个Client请对会对应到…

快速排序与代码

快速排序&#xff08;Quicksort&#xff09;是一种常用的排序算法&#xff0c;它基于分治的思想。 时间复杂度&#xff1a;O&#xff08;nlogn&#xff09; 空间复杂度&#xff1a;O&#xff08;logn&#xff09; 快速排序的基本思想如下&#xff1a; 选择一个元素作为基准&a…

文档升级 | iTOP-RK3568开发板ADB工具的安装和使用

iTOP -RK3568开发板使用手册更新&#xff0c;后续资料会不断更新&#xff0c;不断完善&#xff0c;帮助用户快速入门&#xff0c;大大提升研发速度。 《iTOP-3568开发板ADB使用手册》进行了文档升级&#xff0c;对ADB工具的安装和使用进行了更全面的步骤介绍。 第1章 安装adb工…

JMeter之脚本录制

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; 前言&#xff1a; 对于一些JMeter初学者来说&#xff0c;录制脚本可能是最容易掌握的技能之一。…