C++ 设计模式:备忘录模式(Memento Pattern)

news2025/1/5 8:21:08

链接:C++ 设计模式
链接:C++ 设计模式 - 状态模式

备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下捕获和恢复对象的内部状态。这个模式在需要保存和恢复对象状态的场景中非常有用,例如实现撤销操作。

1.问题分析

在开发中,有时需要保存对象的状态,以便在需要时恢复到之前的状态。这种需求在撤销/重做操作、游戏存档、编辑器状态恢复等场景中尤为常见。
备忘录模式通过将对象的状态封装在一个独立的备忘录对象中,实现了状态的保存和恢复,同时保持了对象的封装性。

2.实现步骤

  1. 定义备忘录类:存储对象的内部状态,
  2. 定义发起人类:负责创建和恢复备忘录。
  3. 定义管理者类:负责保存和管理备忘录对象。
  4. 客户端代码:实现保存状态到备忘录和从备忘录恢复状态。

3.代码示例

3.1.定义备忘录类

// Memento类,负责存储机器人的状态
class Memento {
 public:
  Memento(int x, int y, const std::string& state) : x_(x), y_(y), state_(state) {}
  int getX() const { return x_; }
  int getY() const { return y_; }
  std::string getState() const { return state_; }

 private:
  int x_;
  int y_;
  std::string state_;
};

3.2.定义发起人类

// Robot类,负责创建和恢复Memento
class Robot {
 public:
  void setPosition(int x, int y) {
    x_ = x;
    y_ = y;
    std::cout << "Position set to: (" << x << ", " << y << ")" << std::endl;
  }

  void setState(const std::string& state) {
    state_ = state;
    std::cout << "State set to: " << state << std::endl;
  }

  Memento saveStateToMemento() { return Memento(x_, y_, state_); }

  void getStateFromMemento(const Memento& memento) {
    x_ = memento.getX();
    y_ = memento.getY();
    state_ = memento.getState();
    std::cout << "State restored to: (" << x_ << ", " << y_ << "), " << state_ << std::endl;
  }

 private:
  int x_;
  int y_;
  std::string state_;
};

3.3.定义管理者类

// Caretaker类,负责保存和恢复Memento
class Caretaker {
 public:
  void addMemento(const Memento& memento) { mementos_.push_back(memento); }

  Memento getMemento(int index) const { return mementos_.at(index); }

 private:
  std::vector<Memento> mementos_;
};

3.4.客户端代码

int main() {
  Robot robot;
  Caretaker caretaker;

  robot.setPosition(0, 0);
  robot.setState("Idle");
  caretaker.addMemento(robot.saveStateToMemento());

  robot.setPosition(10, 20);
  robot.setState("Moving");
  caretaker.addMemento(robot.saveStateToMemento());

  robot.setPosition(30, 40);
  robot.setState("Stopped");

  robot.getStateFromMemento(caretaker.getMemento(0));
  robot.getStateFromMemento(caretaker.getMemento(1));

  return 0;
}

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

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

相关文章

Listwise 排序之 LambdaRank:最大化 NDCG 的秘诀

Listwise系列相关文章&#xff08;置顶&#xff09; 1.Listwise 模型时间线梳理 2.Listwise 排序之 LambdaRank&#xff1a;最大化 NDCG 的秘诀 引言 LambdaRank 是一种用于排序学习&#xff08;Learning to Rank, LTR&#xff09;的模型&#xff0c;特别适用于推荐系统和信息…

汉化SecureCRT9.1

我个人觉得&#xff0c;SecureCRT是最好用的ssh远程工具软件&#xff0c;但是这个软件没有中文版本&#xff0c;我这种英文水平糟糕的人用起来&#xff0c;略有不便&#xff0c;因为一直没有在网上找到合适的汉化版本&#xff0c;于是有自己做一个汉化版本的计划。 前几日&…

我在广州学 Mysql 系列——插入、更新与删除数据详解以及实例

ℹ️大家好&#xff0c;我是练小杰&#xff0c;今天是2024年12月30号&#xff0c;明天就是2024最后一天了&#xff01;&#xff01; 本文将讲述MYSQL数据库的插入&#xff0c;更新以及删除数据~~ 复习&#xff1a;&#x1f449;【有关Mysql数据库的单表&#xff0c;多表查询的练…

HarmonyOS Next ArkUI ListListItem笔记

学习目标&#xff1a; List和ListItem的使用 学习内容&#xff1a; import { NewsInfo, newsInfoList } from ../viewmodel/NewsInfoclass DividerTmp {strokeWidth: Length 1startMargin: Length 60endMargin: Length 10color: ResourceColor #ffe9f0f0constructor(str…

机器人C++开源库The Robotics Library (RL)使用手册(四)

建立自己的机器人3D模型和运动学模型 这里以国产机器人天机TR8为例,使用最普遍的DH运动学模型,结合RL所需的描述文件,进行生成。 最终,需要的有两个文件,一个是.wrl三维模型描述文件;一个是.xml运动学模型描述文件。 1、通过STEP/STP三维文件生成wrl三维文件 机器人的…

游戏引擎学习第70天

这一节没讲什么主要是关于接下来要干的任务 开发过程概览 我们正在进行最后的总结&#xff0c;并计划接下来的步骤。目前的目标是创建一个包含所有必要组件的游戏引擎原型版本&#xff0c;目的是让这些部分能够协同工作并展现预期效果。通过这一过程&#xff0c;可以实验和探…

Android笔试面试题AI答之Android基础(8)

Android入门请看《Android应用开发项目式教程》&#xff0c;视频、源码、答疑&#xff0c;手把手教 文章目录 1.Android新建工程需要注意的地方有哪些&#xff1f;**1. 选择合适的项目模板****2. 配置项目基本信息****3. 选择最低 SDK 版本****4. 配置构建工具****5. 选择编程…

传统听写与大模型听写比对

在快节奏的现代生活中&#xff0c;听写技能仍然是学习语言和提升认知能力的重要环节。然而&#xff0c;传统的听写练习往往枯燥乏味&#xff0c;且效率不高。现在&#xff0c;随着人工智能技术的发展&#xff0c;大模型听写工具的问世&#xff0c;为传统听写带来了革命性的变革…

赛博周刊·2024年度工具精选(画板二维码类)

一、画板类 1、Excalidraw 一款好用的手绘工具&#xff0c;无需注册&#xff0c;支持多人协作。GitHub项目地址&#xff1a;https://github.com/excalidraw/excalidraw。 2、 Floating Whiteboard 一个在线的网页白板工具。 3、BoardOS&#xff1a;在线实时白板协作系统 一…

论文研读:Text2Video-Zero 无需微调,仅改动<文生图模型>推理函数实现文生视频(Arxiv 2023-03-23)

论文名&#xff1a;Text2Video-Zero: Text-to-Image Diffusion Models are Zero-Shot Video Generators 1. 摘要 1.1 方法总结 通过潜空间插值, 实现动作连续帧。 以第一帧为锚定&#xff0c;替换原模型的self-attention&#xff0c;改为cross-attention 实现 保证图片整体场…

Spring自动化创建脚本-解放繁琐的初始化配置!!!(自动化SSM整合)

一、实现功能(原创&#xff0c;转载请告知) 1.自动配置pom配置文件 2.自动识别数据库及数据表&#xff0c;创建Entity、Dao、Service、Controller等 3.自动创建database.properties、mybatis-config.xml等数据库文件 4.自动创建spring-dao.xml spring-mvc.xml …

Unity3D仿星露谷物语开发12之创建道具列表

1、目标 道具是游戏的核心部分&#xff0c;道具包括你可以拾取的东西&#xff0c;你可以使用的工具和你能种的东西等。 本节就是创建道具的信息类。同时了解ScriptableObject类的使用。 2、创建道具枚举类 修改Assets -> Scripts -> Enums.cs脚本&#xff0c; 新增如…

华为配置 之 RIP

简介&#xff1a; RIP&#xff08;路由信息协议&#xff09;是一种广泛使用的内部网关协议&#xff0c;基于距离向量算法来决定路径。它通过向全网广播路由控制信息来动态交换网络拓扑信息&#xff0c;从而计算出最佳路由路径。RIP易于配置和理解&#xff0c;非常适用于小型网络…

使用new String(“yupi”)语句在Java中会创建多少个对象?

在 Java 编程中&#xff0c;字符串的处理是一个常见且重要的部分。理解字符串对象的创建和内存管理对于编写高效和优化的代码至关重要。当我们在 Java 中使用 new String("yupi") 语句时&#xff0c;实际上会涉及到多个对象的创建。本文将详细解释这一过程&#xff0…

vue使用el-select下拉框自定义复选框

在 Vue 开发中&#xff0c;高效且美观的组件能极大地提升用户体验和开发效率。在vue中使用elementplus 的 el-select下拉框实现了一个自定义的多选下拉框组件。 一、代码功能概述 这段代码创建了一个可多选的下拉框组件&#xff0c;通过el-select和el-checkbox-group结合的方…

Python基于EasyOCR进行路灯控制箱图像文本识别项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 随着城市化进程的加快&#xff0c;智能城市建设成为了现代社会发展的重要方向。路灯作为城市基础设…

TDengine 新功能 VARBINARY 数据类型

1. 背景 VARBINARY 数据类型用于存储二进制数据&#xff0c;与 MySQL 中的 VARBINARY 数据类型功能相同&#xff0c;VARBINARY 数据类型长度可变&#xff0c;在创建表时指定最大字节长度&#xff0c;使用进按需分配存储&#xff0c;但不能超过建表时指定的最大值。 2. 功能说明…

使用位操作符实现加减乘除!

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;使用位操作符实现加减乘除 发布时间&#xff1a;2025.1.1 隶属专栏&#xff1a;C语言 目录 位操作实现加法运算&#xff08;&#xff09;原理代码示例 位操作实现减法运算&#xff08;-&#xff09;原理代码示例 位…

基于SpringBoot的题库管理系统的设计与实现(源码+SQL+LW+部署讲解)

文章目录 摘 要1. 第1章 选题背景及研究意义1.1 选题背景1.2 研究意义1.3 论文结构安排 2. 第2章 相关开发技术2.1 前端技术2.2 后端技术2.3 数据库技术 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系统需求分析 4. 第4章 系统概要设计4.1 系统功能模块设计4.2 数据库设计 5.…

MATLAB条件判断(switch-case-otherwise-end型)

在条件判断时&#xff0c;遇到很多个条件&#xff0c;如果再用 i f − e l s e if-else if−else语句就显得很繁琐&#xff0c;所以我们可以用 s w i t c h switch switch来解决 结构&#xff1a; 判断对象可以为数字&#xff0c;也可以为字符 如图&#xff1a; 注意&#x…