行为型-备忘录模式(Memento Pattern)

说明

备忘录模式是一种行为型设计模式,通过捕获一个对象的内部状态,并在该对象之外保存这个状态,以便在需要时恢复对象到原先的状态。备忘录模式包含三个核心角色:。

  1. 发起人(Originator):负责创建一个备忘录,并记录当前对象的内部状态到备忘录中。
  2. 备忘录(Memento):负责存储发起人对象的内部状态,提供给发起人对象恢复内部状态的方法。
  3. 负责人(Caretaker):负责保存备忘录,可以使用备忘录来回滚对象的状态。

备忘录模式的核心思想是将对象的状态保存在一个独立的对象中,以便以后恢复。通过使用备忘录模式,我们可以轻松地实现对象状态的保存和恢复,同时也提高了系统的可维护性和扩展性。

优点
  • 它提供了一种可以在不破坏封装性的情况下恢复对象状态的方法。
  • 它简化了发起人对象的设计,避免了复杂的状态管理。
  • 它可以在不影响客户端的情况下实现对象的历史记录和撤销操作。
缺点
  • 需要消耗一定的内存空间来存储备忘录对象。
  • 如果发起人对象的状态非常庞大,那么备忘录对象的存储和恢复操作可能会很昂贵。
使用场景
  • 需要保存和恢复对象状态的场景,例如游戏中的存档功能、文档编辑器的撤销和恢复功能等。
  • 需要提供对象的历史记录和撤销功能的场景,例如文本编辑器中的编辑历史记录、Web浏览器中的前进和后退功能等。

示例

下面以一个游戏存档的例子来说明备忘录模式的实现。

首先,我们定义游戏类Game,其中包含当前游戏的状态信息和对状态进行修改和恢复的方法:

public class Game {private String level;private int score;public Game(String level, int score) {this.level = level;this.score = score;}public String getLevel() {return level;}public void setLevel(String level) {this.level = level;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}public void printStatus() {System.out.println("当前游戏状态:level=" + level + ", score=" + score);}// 创建备忘录public Memento createMemento() {return new Memento(level, score);}// 从备忘录中恢复状态public void restoreMemento(Memento memento) {this.level = memento.getLevel();this.score = memento.getScore();}
}

然后,我们定义备忘录类Memento,用于存储游戏状态:

public class Memento {private String level;private int score;public Memento(String level, int score) {this.level = level;this.score = score;}public String getLevel() {return level;}public int getScore() {return score;}
}

最后,我们定义管理者类Caretaker,用于保存游戏状态的备忘录,并支持回溯和恢复操作:

import java.util.Stack;public class Caretaker {private Stack<Memento> mementoStack = new Stack<>();// 保存当前状态public void save(Game game) {mementoStack.push(game.createMemento());}// 回溯到上一个状态public void undo(Game game) {if (!mementoStack.isEmpty()) {game.restoreMemento(mementoStack.pop());}}// 恢复到最初状态public void reset(Game game) {mementoStack.clear();game.setLevel("简单");game.setScore(0);}
}

现在,我们可以创建游戏对象、备忘录对象和管理者对象,进行游戏状态的保存、回溯和恢复:

public class MementoExample {public static void main(String[] args) {// 创建游戏对象Game game = new Game("简单", 0);// 创建管理者对象Caretaker caretaker = new Caretaker();// 保存当前状态caretaker.save(game);// 改变游戏状态game.setLevel("普通");game.setScore(100);// 保存当前状态caretaker.save(game);// 改变游戏状态game.setLevel("困难");game.setScore(200);// 保存当前状态caretaker.save(game);// 回溯到上一个状态caretaker.undo(game);game.printStatus(); // 当前游戏状态:level=普通, score=100// 回溯到最初状态caretaker.reset(game);game.printStatus(); // 当前游戏状态:level=简单, score=0}
}

现在,我们可以创建游戏对象、备忘录对象和管理者对象,进行游戏状态的保存、回溯和恢复:

当前游戏状态:level=普通, score=100
当前游戏状态:level=简单, score=0

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

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

相关文章

论文精读之BERT

目录 1.摘要&#xff08;Abstract&#xff09; 2.引言&#xff08;Introduction&#xff09;&#xff1a; 3.结论&#xff08;Conlusion&#xff09;&#xff1a; 4.BERT模型算法: 5.总结 1.摘要&#xff08;Abstract&#xff09; 与别的文章的区别是什么:BERT是用来设计去…

springboot创建并配置环境(三) - 配置扩展属性(上集)

文章目录 一、介绍二、配置文件application.yml 一、介绍 在上一篇文章&#xff1a;springboot创建并配置环境(二) - 配置基础环境中&#xff0c;我们介绍了springboot如何配置基础环境变量。本篇文章讨论如何处理配置文件。即来自不同位置的配置属性&#xff0c;如&#xff1…

【Chat GPT】用 ChatGPT 运行 Python

前言 ChatGPT 是一个基于 GPT-2 模型的人工智能聊天机器人&#xff0c;它可以进行智能对话&#xff0c;同时还支持 Python 编程语言的运行&#xff0c;可以通过 API 接口进行调用。本文将介绍如何使用 ChatGPT 运行 Python 代码&#xff0c;并提供一个实际代码案例。 ChatGPT …

简单理解大模型参数高效微调中的LoRA(Low-Rank Adaptation)

[论文地址] [代码] [ICLR 22] 阅前须知&#xff1a;本博文可能有描述不准确/过度简化/出错的地方&#xff0c;仅供参考。 网络结构 其中&#xff0c;原有模型的参数是直接冻结的&#xff0c;可训练参数只有额外引入的LoRA参数(由nn.Parameter实现)。 模型微调的本质 记网络原…

LabVIEW实现三相异步电机磁通模型

LabVIEW实现三相异步电机磁通模型 三相异步电动机由于经济和出色的机电坚固性而广泛用于工业化应用。这台机器的设计和驱动非常简单&#xff0c;但在控制扭矩和速度方面&#xff0c;它隐藏了相当大的功能复杂性。通过数学建模&#xff0c;可以理解机器动力学。 基于微分方程的…

【嵌入式学习笔记】嵌入式基础9——STM32启动过程

1.MAP文件浅析 1.1.MDK编译后生成的中间过程文件 1.2.Map文件构成&#xff1a; 程序段交叉引用关系&#xff08;Section Cross References&#xff09;&#xff1a;描述各文件之间函数调用关系删除映像未使用的程序段&#xff08;Removing Unused input sections from the im…

Netty学习(二)

文章目录 二. Netty 入门1. 概述1.1 Netty 是什么&#xff1f;1.2 Netty 的作者1.3 Netty 的地位1.4 Netty 的优势 2. Hello World2.1 目标加入依赖 2.2 服务器端2.3 客户端2.4 流程梳理课堂示例服务端客户端 分析提示&#xff08;重要&#xff09; 3. 组件3.1 EventLoop事件循…

【图像处理】使用 OpenCV 将您的照片变成卡通

图像到卡通 一、说明 在当今世界&#xff0c;我们被图像和视频所包围。从社交媒体到广告&#xff0c;图像已成为一种强大的交流媒介。但是你有没有想过&#xff0c;如果你能把你的照片变成卡通会发生什么&#xff1f;想象一下&#xff0c;为您最喜欢的照片创建动画版本&#xf…

express 路由匹配和数据获取

express配置路由只需要通过app.method(url,func)来配置&#xff0c;其中url配置和其中的参数获取方法不同 直接写全路径 路由中允许存在. get请求传入的参数 router.get("/home", (req, res) > {res.status(200).send(req.query); });通过/home?a1会收到对象…

Spark的DataFrame和Schema详解和实战案例Demo

1、概念介绍 Spark是一个分布式计算框架&#xff0c;用于处理大规模数据处理任务。在Spark中&#xff0c;DataFrame是一种分布式的数据集合&#xff0c;类似于关系型数据库中的表格。DataFrame提供了一种更高级别的抽象&#xff0c;允许用户以声明式的方式处理数据&#xff0c…

MyBatis-Plus

1.入门案例 1.1 pom依赖引用 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version> </dependency><dependency><groupId>mysql</grou…

Pytorch深度学习-----神经网络的基本骨架-nn.Module的使用

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

python爬虫基础入门——利用requests和BeautifulSoup

(本文是自己学习爬虫的一点笔记和感悟) 经过python的初步学习,对字符串、列表、字典、元祖、条件语句、循环语句……等概念应该已经有了整体印象,终于可以着手做一些小练习来巩固知识点,写爬虫练习再适合不过。 1. 网页基础 爬虫的本质就是从网页中获取所需的信息,对网…

ClickHouse使用场景和案列分析

目录 一、ClickHouse 概述1. ClickHouse简介2. ClickHouse 发展历程3. ClickHouse 特点 二、ClickHouse 架构1. 数据存储层&#xff1a;2. SQL 解析层&#xff1a;3. 查询执行层&#xff1a;4. 数据压缩层&#xff1a; 三、ClickHouse 性能优化1. 查询优化&#xff1a;2. 数据压…

QT:qInstallMessageHandler打印日志重定向

目录 1、qInstallMessageHandler含义 2、实例&#xff1a; 3、调试级别Q包含用于警告和调试文本的全局宏&#xff1a; 4、打印日志&#xff0c;如何使用 1、qInstallMessageHandler含义 &#xff08;1&#xff09;此函数在使用Qt消息处理程序之前已定义。返回一个指向前一…

Python代理模式介绍、使用

一、Python代理模式介绍 Python代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式。在代理模式中&#xff0c;代理对象充当了另一个对象的占位符&#xff0c;以控制对该对象的访问。 代理对象和被代理对象实现了相同的接口&#xff0c;因此它们可以互相替代…

类加载机制与类加载器

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ Java 源码是如何形成类文件的&#xff0c;类文件又是如何加载到虚拟机的&#xff0c;类加载有哪些机制和原则呢&#xff1f;本文将为大家一一介绍。 1 Java 源码形成类文件…

基于拉格朗日-遗传算法的最优分布式能源DG选址与定容(Matlab代码实现)

目录 1 概述 2 数学模型 2.1 问题表述 2.2 DG的最佳位置和容量&#xff08;解析法&#xff09; 2.3 使用 GA 进行最佳功率因数确定和 DG 分配 3 仿真结果与讨论 3.1 33 节点测试配电系统的仿真 3.2 69 节点测试配电系统仿真 4 结论 1 概述 为了使系统网损达到最低值&a…

AI Chat 设计模式:10. 组合模式

本文是该系列的第八篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 给我介绍一下组合模式A.1Q.2 好的&#xff0c;给我举一个组合模式的例子&#xff0c;使…

idea导入maven项目问题

问题产生原因&#xff1a; ①idea加载maven项目&#xff0c;如果网络不通畅&#xff0c;会在maven仓库中产生一个文件&#xff0c;如下图所示: ②当网络通畅时&#xff0c;在下载就会因为此文件导致无法下载正确的maven依赖 解决方案&#xff1a; ①打开maven仓库的根目录 ②…