设计模式之-备忘录模式,快速掌握备忘录模式,通俗易懂的讲解备忘录模式以及它的使用场景

文章目录

  • 一、快速理解备忘录模式
  • 二、备忘录模式使用场景
  • 三、代码示例
  • 四、我们再来听一个故事,加深一下理解
  • 五、备忘录模式的优缺点
    • 优点
    • 缺点
  • 总结


一、快速理解备忘录模式

备忘录模式(Memento Pattern)是一种行为型设计模式,用于在不破坏封装性的前提下,捕获和存储对象的内部状态,并在需要时进行恢复。它将对象的状态封装在备忘录对象中,以便在需要时可以还原到之前的状态。

二、备忘录模式使用场景

  1. 需要保存和恢复对象的内部状态,以便在后续操作中使用。
  2. 需要在不破坏对象封装性的前提下,获取对象的状态快照。
  3. 需要提供撤销操作的功能。

三、代码示例

以下是一个简单的示例,通过备忘录模式实现了一个文本编辑器的撤销功能。

// 备忘录类 - 保存文本编辑器的状态
class EditorMemento {private String content;public EditorMemento(String content) {this.content = content;}public String getContent() {return content;}
}// 原发器类 - 文本编辑器
class TextEditor {private String content;public void setContent(String content) {this.content = content;}public String getContent() {return content;}public EditorMemento save() {return new EditorMemento(content);}public void restore(EditorMemento memento) {content = memento.getContent();}
}// 客户端代码
public class Main {public static void main(String[] args) {TextEditor editor = new TextEditor();editor.setContent("Hello, World!"); // 设置初始内容System.out.println("初始内容: " + editor.getContent());EditorMemento memento = editor.save(); // 保存状态editor.setContent("Hello, OpenAI!"); // 修改内容System.out.println("修改后的内容: " + editor.getContent());editor.restore(memento); // 恢复到之前的状态System.out.println("恢复后的内容: " + editor.getContent());}
}

在上述代码中,我们定义了备忘录类 EditorMemento,用于保存文本编辑器 TextEditor 的状态。TextEditor 类提供了设置内容、获取内容、保存状态和恢复状态的方法。客户端代码演示了文本编辑器的使用,包括修改内容、保存状态、恢复状态等操作。

四、我们再来听一个故事,加深一下理解

故事背景:
假设你是一位玩家,正在玩一款角色扮演游戏。在游戏中,你的角色可以通过完成任务和战斗来提升等级、获得物品和装备。然而,你发现游戏没有提供保存进度的功能,一旦退出游戏,你的角色的进展将会丢失。你希望能够保存游戏进度,以便在需要时可以恢复到之前的状态。

备忘录模式的应用:
你决定使用备忘录模式来实现游戏存档功能。你创建了一个游戏存档管理器类(Caretaker),它负责存储和管理游戏的备忘录对象(Memento)。每当你想保存游戏进度时,你会创建一个备忘录对象,将当前角色的状态(等级、经验、装备等)保存在备忘录中,并将备忘录对象交给存档管理器保存。当你想恢复游戏进度时,你可以向存档管理器请求获取最新的备忘录对象,并从中恢复角色的状态。

这样,你就可以在玩游戏时随时保存进度,并在需要时恢复到之前的状态。无论是因为意外退出游戏、尝试不同的策略还是回顾过去的成就,备忘录模式为你提供了一种可靠的方式来保存和恢复游戏进度。

在这个故事中,备忘录模式充当了游戏存档的功能。它通过创建备忘录对象来捕获和保存游戏角色的状态,而存档管理器类则负责管理这些备忘录对象。这样,你可以随时保存和恢复游戏进度,享受游戏的乐趣。

下是一个简单的Java代码示例,演示了如何使用备忘录模式实现游戏存档功能:

// 备忘录类 - 存储游戏角色的状态
class GameMemento {private int level;private int experience;private String equipment;public GameMemento(int level, int experience, String equipment) {this.level = level;this.experience = experience;this.equipment = equipment;}public int getLevel() {return level;}public int getExperience() {return experience;}public String getEquipment() {return equipment;}
}// 原发器类 - 游戏角色
class GameCharacter {private int level;private int experience;private String equipment;public void setLevel(int level) {this.level = level;}public void setExperience(int experience) {this.experience = experience;}public void setEquipment(String equipment) {this.equipment = equipment;}public GameMemento save() {return new GameMemento(level, experience, equipment);}public void restore(GameMemento memento) {level = memento.getLevel();experience = memento.getExperience();equipment = memento.getEquipment();}public void displayStatus() {System.out.println("Level: " + level);System.out.println("Experience: " + experience);System.out.println("Equipment: " + equipment);}
}// 存档管理器类 - 管理游戏的备忘录
class GameSaveManager {private GameMemento memento;public void saveGame(GameMemento memento) {this.memento = memento;}public GameMemento loadGame() {return memento;}
}// 客户端代码
public class Main {public static void main(String[] args) {GameCharacter character = new GameCharacter();GameSaveManager saveManager = new GameSaveManager();// 初始状态character.setLevel(1);character.setExperience(0);character.setEquipment("Wooden Sword");character.displayStatus();// 保存游戏进度GameMemento memento = character.save();saveManager.saveGame(memento);// 模拟游戏进展character.setLevel(5);character.setExperience(1000);character.setEquipment("Legendary Sword");character.displayStatus();// 恢复游戏进度GameMemento savedMemento = saveManager.loadGame();character.restore(savedMemento);character.displayStatus();}
}

在上述代码中,我们定义了备忘录类 GameMemento,用于保存游戏角色的状态。游戏角色类 GameCharacter 具有设置状态、保存状态和恢复状态的方法,并且可以显示当前状态。存档管理器类 GameSaveManager 负责保存和加载游戏的备忘录对象。

在客户端代码中,我们创建了游戏角色实例和存档管理器实例。首先,我们设置游戏角色的初始状态,并显示状态信息。然后,我们使用备忘录模式保存当前状态并存储在存档管理器中。接下来,我们模拟游戏的进展,修改游戏角色的状态,并显示新的状态信息。最后,我们从存档管理器中加载备忘录对象,恢复游戏角色的状态,并再次显示状态信息。

通过运行以上代码,你将看到游戏角色的状态在保存和恢复过程中得到正确的处理,实现了游戏存档的功能。

五、备忘录模式的优缺点

优点

  • 对象的状态可以被保存和恢复,提供了一种灵活的方式来处理状态的变化。
  • 备忘录对象与原发器对象相互独立,封装了对象的状态,保证了封装性和信息隐藏。
  • 可以轻松实现撤销操作,使得系统具有可逆性。

缺点

  • 如果要保存的状态较大或频繁保存状态,会消耗较多的内存。
  • 在使用备忘录模式时,需要权衡备忘录对象的创建和管理成本。

总结

备忘录模式的核心思想是通过备忘录对象来存储和恢复对象的状态,以实现状态的保存和恢复功能。它的应用场景包括各种需要保存和恢复状态的情况,比如编辑器的撤销功能、游戏中的存档功能等。通过备忘录模式,我们可以在不破坏封装性的前提下,轻松实现对象状态的保存和恢复。

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

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

相关文章

pytorch 踩坑

pytorch 踩坑 在pytorch中,如果你定义了没用的组件,同样也会影响你的模型(我也不知道从哪里影响的),看一个例子 def _make_layer(self, block, planes, blocks, stride1, dilateFalse):norm_layer self._norm_layer#downsample Noneprevio…

外卖系统开发:构建高效、安全的外卖平台

在当今数字化时代,外卖系统成为了餐饮行业不可或缺的一部分。本文将介绍如何使用一些主流的技术和代码片段来开发一个简单而功能强大的外卖系统。 1. 技术选择 在开始外卖系统的开发之前,首先需要选择合适的技术栈。以下是一个常见的技术栈&#xff1…

新型智慧城市解决方案:PPT全文56页,附下载

关键词:智慧城市解决方案,智慧城市管理技术,智慧城市建设,数字城市建设 一、智慧城市宏观形势 1、政策支持:出台了一系列政策,鼓励和支持智慧城市的发展。这些政策为智慧城市的建设提供了政策保障和资金支…

贪心算法实现

1、概述 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而 希望导致结果是最好或最优的算法。 贪心算法的每一步都是基于当前状态下的最优解来选择下一步,因此它不能保证全局最优 解&#xff0c…

小区物业大数据监控服务平台(PSD文件资料)

现分享简约物业大数据平台页面、小区物业大数据监控服务平台模版的UI源文件,供设计师们快速获取PS源文件完成工作。 若需 更多行业 相关的大屏,请移步小7的另一篇文章:200套精选数据可视化大屏,大屏PSD设计(各行业大屏…

ACE中为socket增加keepalive策略(windows和linux)

0、现象描述 在国产麒麟系统下,基于ACE的tcp-socket,如果长时间不操作,则会自动切断连接,经测试发现,这个时间的上限为30分钟(几乎不差1秒) 经查看/proc/sys/net/ipv4/tcp_keepalive_time=7200,按说是2小时,但测试发现就是30分钟。索性,就通过程序来动态设置keepaliv…

PHP-FPM 的主要作用和功能:

管理 PHP 进程池: PHP-FPM 负责启动和管理 PHP 进程池。进程池是一组 PHP 进程,它们等待来自 Web 服务器的请求。PHP-FPM 可以根据配置中的参数来动态调整进程池的大小,以适应不同的负载情况。 处理 FastCGI 请求: PHP-FPM 使用 F…

ssh工具 向指定的ssh服务器配置公钥

此文分享一个python脚本,用于向指定的ssh服务器配置公钥,以达到免密登录ssh服务器的目的。 效果演示 🔥完整演示效果 👇第一步,显然,我们需要选择功能 👇第二步,确认 or 选择ssh服务器 👇第三步,输入ssh登录密码,以完成公钥配置 👇验证,我们通过ssh登录…

python区块链简单模拟【03】

引入钱包,账户地址,公私钥 # 导入椭圆曲线算法 from ecdsa import SigningKey, SECP256k1, VerifyingKey, BadSignatureError import binascii import base64 from hashlib import sha256class Wallet:"""钱包"""def __i…

(1)(1.11) SiK Radio v2(一)

文章目录 前言 1 概述 2 特点 3 状态LED灯 前言 SiK 遥测无线电是在自动驾驶仪和地面站之间建立遥测连接的最简单方法之一。本文提供了如何连接和配置无线电的基本用户指南。 3DR Radio v2(SiKRadio 的消费者版本) !Note 本页面以前的…

企业跨境数据传输的创新技术和应用领域

在当前数字化时代,跨境数据传输成为一个极为关键的领域。随着数据传输需求的不断增加,跨国企业在这一过程中面临着越来越多的问题。为了解决这些挑战,创新技术层出不穷,为跨境数据传输提供了更高效、安全和可靠的解决方案。本文将…

visual studio code B站教程:GPT4

B站教程:AI编程辅助神器-CodeMoss使用介绍_哔哩哔哩_bilibili 通用 General 按 Press 功能 Function Ctrl Shift P,F1 显示命令面板 Show Command Palette Ctrl P 快速打开 Quick Open Ctrl Shift N 新窗口/实例 New window/instance Ctrl Sh…

经验 | IDEA常用快捷键

1、编辑(Editing) Ctrl Space 基本的代码完成(类、方法、属性) Ctrl Alt Space 快速导入任意类 Ctrl Shift Enter 语句完成 Ctrl P 参数信息(在方法中调用参数) Ctrl Q 快速查看文档 Shift F…

Flink CDC 1.0至3.0回忆录

Flink CDC 1.0至3.0回忆录 一、引言二、CDC概述三、Flink CDC 1.0:扬帆起航3.1 架构设计3.2 版本痛点 四、Flink CDC 2.0:成长突破4.1 DBlog 无锁算法4.2 FLIP-27 架构实现4.3 整体流程 五、Flink CDC 3.0:应运而生六、Flink CDC 的影响和价值…

腾讯云4核8G服务器选择轻量还是标准型S5服务器?

腾讯云4核8G服务器优惠价格表,云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元,5年6490.44元,轻量应用服务器4核8G12M带宽一年446元、529元15个月,阿腾云atengyun.com分享腾讯云4核8G服务器详细配置、优惠价格及限制条件&…

whistle网络监控 fiddler的开源替代

github源码:https://github.com/avwo/whistle 官网说明:http://wproxy.org/whistle/ windows/mac一键安装 先安装nodejs 然后运行命令 npm i -g whistle && w2 start --init启动 w2 start停止 w2 stop注意停止后要手动关闭代理服务器设置 w…

【免杀测试】Kali之Metasploit几款工具免杀练习

余磊 不知攻,焉知防。作为渗透测试攻城狮,实战之前要做大量的攻防练习。一般黑客拿到主机的shell之后,需要留后门方便进行下一步的渗透。普通的木马已经很容易被查杀工具识别,这时就催生出了免杀技术来绕过杀毒软件。 下面就尝试…

为什么需要升级EKS

当谈到在云环境中管理容器化应用程序时,Amazon EKS(Elastic Kubernetes Service)是一个备受欢迎的选择。它为用户提供了一个强大且高度可扩展的平台,使他们能够轻松地在Kubernetes上运行和管理应用程序。随着技术的不断发展&#…

[hive] sql中distinct的用法和注意事项

在 Hive SQL 中,DISTINCT 用于去重查询结果中的行。它返回唯一的行,消除结果集中的重复项。以下是 DISTINCT 的基本用法和一些注意事项: 基本用法: -- 获取列1和列2的唯一组合 SELECT DISTINCT column1, column2 FROM your_tabl…

前端性能优化十五:js优化的总体原则

1. js优化的总体原则: ①. 当需要时才优化:a. 项目到了某个阶段才需要优化.(1). 大的改版、代码架构无法满足现有业务.②. 考虑可维护性:a. 考虑团队的开发水平、规范.b. 不是为了优化牺牲了后续的可维护性.(1). 提升JS文件的加载性能: ①. 加载元素的顺序:a. css文件放在<…