设计模式:备忘录模式示例

文章目录

    • 示例一
      • 定义备忘录类(Memento)
      • 定义发起人类(Originator)
      • 定义看护人类(Caretaker)
      • 使用备忘录模式
    • 示例二
      • 定义备忘录类(Memento)
      • 定义发起人类(Originator)
      • 定义看护人类(Caretaker)
      • 使用备忘录模式

示例一

让我们设计一个更复杂的场景:一个角色状态管理系统,用于游戏中角色的状态保存和恢复。在游戏中,角色可能会经历战斗,其生命值(HP)、魔法值(MP)和金币(Gold)等属性会发生变化。玩家可以在任何时刻保存当前的状态,并在需要时恢复到之前保存的状态。

定义备忘录类(Memento)

public class CharacterMemento {private int hp;private int mp;private int gold;public CharacterMemento(int hp, int mp, int gold) {this.hp = hp;this.mp = mp;this.gold = gold;}public int getHp() {return hp;}public int getMp() {return mp;}public int getGold() {return gold;}
}

定义发起人类(Originator)

public class GameCharacter {private int hp;private int mp;private int gold;public GameCharacter(int hp, int mp, int gold) {this.hp = hp;this.mp = mp;this.gold = gold;}public void setHp(int hp) {this.hp = hp;}public void setMp(int mp) {this.mp = mp;}public void setGold(int gold) {this.gold = gold;}public int getHp() {return hp;}public int getMp() {return mp;}public int getGold() {return gold;}public CharacterMemento saveState() {return new CharacterMemento(hp, mp, gold);}public void restoreState(CharacterMemento memento) {this.hp = memento.getHp();this.mp = memento.getMp();this.gold = memento.getGold();}
}

定义看护人类(Caretaker)

import java.util.Stack;public class Caretaker {private Stack<CharacterMemento> history = new Stack<>();public void saveState(GameCharacter character) {history.push(character.saveState());}public void restoreState(GameCharacter character) {if (!history.isEmpty()) {character.restoreState(history.pop());}}
}

使用备忘录模式

public class Main {public static void main(String[] args) {GameCharacter character = new GameCharacter(100, 50, 10);Caretaker caretaker = new Caretaker();// 保存初始状态caretaker.saveState(character);// 状态变化character.setHp(80);character.setMp(30);character.setGold(20);System.out.println("After battle: HP=" + character.getHp() + ", MP=" + character.getMp() + ", Gold=" + character.getGold());// 恢复到初始状态caretaker.restoreState(character);System.out.println("After restore: HP=" + character.getHp() + ", MP=" + character.getMp() + ", Gold=" + character.getGold());}
}

输出:

After battle: HP=80, MP=30, Gold=20
After restore: HP=100, MP=50, Gold=10

在这个例子中,GameCharacter类是发起人,它能够保存自己的状态到备忘录对象CharacterMemento中,也能从备忘录对象恢复状态。Caretaker类负责维护这些备忘录对象的历史记录,但不对这些对象进行操作或检查。这个示例展示了备忘录模式在游戏角色状态管理中的应用,帮助实现了角色状态的保存和恢复功能。

示例二

定义备忘录类(Memento)

public class GameMemento {private final int lifePoints;private final String location;private final int gold;public GameMemento(int lifePoints, String location, int gold) {this.lifePoints = lifePoints;this.location = location;this.gold = gold;}public int getLifePoints() {return lifePoints;}public String getLocation() {return location;}public int getGold() {return gold;}
}

定义发起人类(Originator)

public class GameCharacter {private int lifePoints;private String location;private int gold;public void setLifePoints(int lifePoints) {this.lifePoints = lifePoints;}public void setLocation(String location) {this.location = location;}public void setGold(int gold) {this.gold = gold;}// 保存状态到备忘录public GameMemento save() {return new GameMemento(lifePoints, location, gold);}// 从备忘录恢复状态public void restore(GameMemento memento) {this.lifePoints = memento.getLifePoints();this.location = memento.getLocation();this.gold = memento.getGold();}
}

定义看护人类(Caretaker)

import java.util.Stack;public class GameSaver {private Stack<GameMemento> mementos = new Stack<>();public void saveGame(GameCharacter character) {mementos.push(character.save());}public void loadGame(GameCharacter character) {if (!mementos.isEmpty()) {character.restore(mementos.pop());}}
}

使用备忘录模式

public class Main {public static void main(String[] args) {GameCharacter character = new GameCharacter();GameSaver saver = new GameSaver();// 初始状态character.setLifePoints(100);character.setLocation("Village");character.setGold(50);System.out.println("Initial state");// 游戏进行,状态改变character.setLifePoints(80);character.setLocation("Dungeon");character.setGold(100);System.out.println("Game progressed, state changed");// 保存游戏saver.saveGame(character);// 继续游戏,状态再次改变character.setLifePoints(30);character.setLocation("Deep Dungeon");character.setGold(150);System.out.println("Game progressed further, state changed again");// 加载游戏,恢复到之前的状态saver.loadGame(character);System.out.println("Game loaded, state restored");}
}

在这个例子中,GameCharacter类代表游戏中的角色,它可以保存自己的状态到GameMemento备忘录中,并能从备忘录中恢复状态。GameSaver类充当看护人的角色,负责管理备忘录,实现游戏的存档和读档功能。

这个简化的游戏存档例子展示了备忘录模式在实际应用中的应用方式,通过这种方式,我们可以在不暴露GameCharacter内部状态的前提下,实现游戏状态的保存和恢复。

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

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

相关文章

力扣 | 148. 排序链表

和数组里面的归并排序思想一致 class Solution {public ListNode sortList(ListNode head) {//过滤条件if(head null || head.next null)return head;ListNode slow head;ListNode fast head.next;while (fast ! null && fast.next ! null){slow slow.next;fast …

Golang基础-12

Go语言基础 介绍 目录操作 创建 删除 重命名 遍历目录 修改权限 文件操作 创建 打开关闭 删除 重命名 修改权限 读文件 写文件 文件定位 拷贝 测试 单元测试 基准测试 示例 介绍 本文介绍Go语言中目录操作&#xff08;创建目录、删除目录、重命名、遍历…

c++的学习之路:20、继承(1)

摘要 本章主要是讲以一下继承的一些概念以及使用方法等等。 目录 摘要 一、继承的概念及定义 1、继承的概念 2、继承定义 1.2.1、定义格式 1.2.2、继承关系和访问限定符 1.2.3、继承基类成员访问方式的变化 3、总结 二、基类和派生类对象赋值转换 三、继承中的作用…

Matlab自学笔记二十九:元胞数组的创建、索引和转换方法

1.概念 元胞数组&#xff08;cell array&#xff09;是一种具有容器特性的数据类型&#xff0c;每个元素可以包含任何类型的数据&#xff1b; 2.创建方法 &#xff08;1&#xff09;方法一&#xff1a;使用大括号{}&#xff1b; &#xff08;2&#xff09;方法二&#xff1…

9【原型模式】复制一个已存在的对象来创建新的对象

你好&#xff0c;我是程序员雪球。 今天我们来学习23种设计模式之原型模式&#xff0c;在平时开发过程中比较少见。我带你了解什么是原型模式&#xff0c;使用场景有哪些&#xff1f;有什么注意事项&#xff1f;深拷贝与浅拷贝的区别&#xff0c;最后用代码实现一个简单的示例…

大数据深度学习:基于Tensorflow深度学习卷积神经网络CNN算法垃圾分类识别系统

文章目录 大数据深度学习&#xff1a;基于Tensorflow深度学习卷积神经网络CNN算法垃圾分类识别系统一、项目概述二、深度学习卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff09;三、部分数据库架构四、系统实现系统模型部分核心代码模型训…

Android之图片压缩几种方式

大概可以分为以下几类&#xff1a;更换图片格式&#xff0c;质量压缩&#xff0c;采样率压缩&#xff0c;缩放压缩&#xff0c;调用jpeg压缩等 1.设置图片格式 Android目前常用的图片格式有png&#xff0c;jpeg和webp&#xff0c; png&#xff1a;无损压缩图片格式&#xff0…

【Java】新手一步一步安装 Java 语言开发环境

文章目录 一、Windows 10 系统 安装 JDK8二、 Mac 系统 安装 JDK8三、IDEA安装 一、Windows 10 系统 安装 JDK8 &#xff08;1&#xff09;打开 JDK下载网站&#xff0c;根据系统配置选择版本&#xff0c;这里选择windows 64位的版本&#xff0c;点击下载&#xff08;这里需要…

5.SpringSpringBoot八股

Spring,Spring MVC,Spring Boot 之间什么关系? Spring就是整个Spring框架的整体&#xff0c;包含AOP、JDBC、Spring MVC等等模块 SpringBoot是Spring的精简版&#xff0c;它在Spring的基础上添加了自动装配、内置tomcat服务器等功能&#xff0c;使得代码量更少&#xff0c;同…

Finetuning vs. Prompting:大语言模型两种使用方式

目录 前言1. 对于大型语言模型的两种不同期待2. Finetune(专才)3. Prompt(通才)3.1 In-context Learning3.2 Instruction-tuning3.3 Chain of Thought(COT) Prompting3.4 用机器来找Prompt 总结参考 前言 这里和大家分享下关于大语言模型的两种使用方式&#xff0c;一种是 Fine…

2024最新 PyCharm 2024.1 更新要点汇总

2024最新 PyCharm 2024.1 更新要点汇总 文章目录 2024最新 PyCharm 2024.1 更新要点汇总摘要引言 Hugging Face&#xff1a;模型和数据集的快速文档预览针对 JavaScript 和 TypeScript 的全行代码补全 PyCharm Professional编辑器中的粘性行编辑器内代码审查新终端 Beta新的 AI…

ip连接检测

1.在C#中&#xff0c;你可以使用Socket类来检测IP连接是否正常。以下是一个简单的示例代码&#xff0c;演示了如何使用Socket类来检测IP连接的可用性&#xff1a; using System; using System.Net; using System.Net.Sockets;class Program {static void Main(string[] args){…

js+网络摄像头实现人体肢体关键点动作捕获

最近有一个项目&#xff0c;客户需要用户人体姿势识别&#xff0c;进行表演考核用途&#xff0c;或者康复中心用户恢复护理考核&#xff0c;需要用摄像头进行人体四肢进行肢体关键点对比考核&#xff0c;资料还是太少了。只有个别大佬发了部分技术指导。感觉写的不错。 阿里云…

【微信小程序——案例——本地生活(列表页面)】

案例——本地生活&#xff08;列表页面&#xff09; 九宫格中实现导航跳转——以汽车服务为案例&#xff08;之后可以全部实现页面跳转——现在先实现一个&#xff09; 在app.json中添加新页面 修改之前的九宫格view改为navitage 效果图&#xff1a; 动态设置标题内容—…

PTA(题目集三 题目 代码 C++ 注解)

目录 题目一&#xff1a; 代码&#xff1a; 题目二&#xff1a; 代码&#xff1a; 题目三&#xff1a; 代码&#xff1a; 题目四&#xff1a; 代码&#xff1a; 题目五&#xff1a; 代码&#xff1a; 题目六&#xff1a; 代码&#xff1a; 题目七&#xff1a; 代码…

【QT+QGIS跨平台编译】161:【qgispython跨平台编译】—【qgis_python.h生成】

点击查看专栏目录 文章目录 一、qgis_python.h介绍二、信息分析三、qgis_python.h生成一、qgis_python.h介绍 qgis_python.h 是 QGIS(Quantum Geographic Information System)GIS 软件的一个头文件。QGIS 是一个开源的地理信息系统软件,提供了丰富的地图制图和空间分析功能。…

第四百五十九回

文章目录 1. 概念介绍2. 方法与细节2.1 获取方法2.2 使用细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取当前系统语言"相关的内容&#xff0c;本章回中将介绍如何获取时间戳.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

Arduino IDE开发esp8266,如何调试

在Arduino IDE中开发ESP8266时,调试通常需要依赖于串行输出(Serial.print 语句)和LED指示灯。由于ESP8266没有像一些高级开发平台那样的内置调试功能(例如JTAG或SWD接口),所以调试可能较为基础。以下是一些用于Arduino IDE中ESP8266开发调试的基本步骤: 环境准备:首先,…

一款绿联VGA转HDMI转换器MS9288A方案

实物 该转换器在后备箱放了一段时间&#xff0c;就成这个样子了&#xff0c;当然&#xff0c;后备箱也比较恶劣&#xff0c;堪比盐雾试验&#xff0c;因为有瓶稀盐酸倒了&#xff0c;发现不及时&#xff0c;一个新的转换器就成这个样子了。 VGA转HDMI转换器VGA输入插头 VGA转…

Go语言中常见的JSON处理错误

1. 由嵌入式字段导致的非预期行为 在下面的例子中,我们创建一个Event结构体,其包含一个ID和一个嵌入式的时间戳: type Event struct {ID inttime.Time } 由于 time.Time 是嵌入式的,因此我们可以直接通过Event来访问 time.Time 方法,比如event.Second( )。 嵌入式字段…