备忘录模式 行为型模式之八

1.定义

         备忘录模式是一种行为型的软件设计模式,在不破坏封装的前提下,获取一个对象的内部状态,并在对象外保存该状态,当对象需要恢复到该状态时,对其进行恢复。

2.组成结构

  1. 原发器 (Originator) 类可以生成自身状态的快照, 也可以在需要时通过快照恢复自身状态。
  2. 备忘录 (Memento) 是原发器状态快照的值对象 (value object)。 通常做法是将备忘录设为不可变的, 并通过构造函数一次性传递数据。
  3. 负责人 (Caretaker) 仅知道 “何时” 和 “为何” 捕捉原发器的状态, 以及何时恢复状态。负责人通过保存备忘录栈来记录原发器的历史状态。 当原发器需要回溯历史状态时, 负责人将从栈中获取最顶部的备忘录, 并将其传递给原发器的恢复 (restoration) 方法。

        在该实现方法中, 备忘录类将被嵌套在原发器中。 这样原发器就可访问备忘录的成员变量和方法, 即使这些方法被声明为私有。 另一方面, 负责人对于备忘录的成员变量和方法的访问权限非常有限: 它们只能在栈中保存备忘录, 而不能修改其状态。

3.示例代码

//Memento.h
/****************************************************/
#pragma once
#include <iostream>
#include <unordered_map>
#include <vector>
#include <list>
#include <string>using namespace std;// 备忘录类-游戏进度
class Memento
{
public:// 构造函数Memento(string state) : m_state(state) {}// 获取状态std::string getState() const {return m_state;}private:std::string m_state;
};// 发起类-游戏
class Game
{
public:// 设置状态void setState(string state) {m_state = state;}// 获取状态string getState() {return m_state;}// 保存状态至备忘录Memento saveStateToMemento() {return Memento(m_state);}// 从备忘录获取状态void getStateFromMemento(const Memento& memento) {m_state = memento.getState();}private:std::string m_state;
};// 备忘录管理类-进度管理
class CareTaker
{
public:// 添加备忘录void addMemento(const Memento& memento) {m_mementos.push_back(memento);}// 获取备忘录Memento getMemento(int index) {return m_mementos[index];}private:std::vector<Memento> m_mementos;
};int main()
{Game game;CareTaker careTaker;// 通关game.setState("进度:第一关通过");game.setState("进度:第二关通过");// 保存进度,进度被管理系统管理careTaker.addMemento(game.saveStateToMemento());// 继续通关game.setState("进度:第三关通过");// 保存进度,进度被管理系统管理careTaker.addMemento(game.saveStateToMemento());// 继续通关game.setState("进度:第四关通过");// 当前进度cout << "当前" << game.getState() << endl;// 获取首个进度game.getStateFromMemento(careTaker.getMemento(0));cout << "1)" << game.getState() << endl;// 获取第二个进度game.getStateFromMemento(careTaker.getMemento(1));cout << "2)" << game.getState() << endl;return 0;
}

4.优缺点

优点:

  1. 良好封装性。发起人对象中的内部状态被保存在备忘录中,也只能由自己读取,对其他对象起到了屏蔽作用。
  2. 提供了状态恢复机制。类似于游戏存档读档。
  3. 简化了发起人职责。发起人状态的存储和获取,被分离出去了。

缺点:

资源消耗较大,对发起人对象不同内部状态的存储,会导致开销增加。

引用

设计模式之备忘录模式(C++)_c++ 备忘录模式-CSDN博客

C++ 设计模式之备忘录模式 - 一杯清酒邀明月 - 博客园 (cnblogs.com)

 

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

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

相关文章

超详细!主流大语言模型的技术原理细节汇总!

1.比较 LLaMA、ChatGLM、Falcon 等大语言模型的细节&#xff1a;tokenizer、位置编码、Layer Normalization、激活函数等。 2. 大语言模型的分布式训练技术&#xff1a;数据并行、张量模型并行、流水线并行、3D 并行、零冗余优化器 ZeRO、CPU 卸载技术 ZeRo-offload、混合精度训…

pip安装或更新

在终端用pip安装时老是报错&#xff0c;把pip升级到最高版本还是不行 ERROR: Exception: Traceback (most recent call last): File "F:\software\anaconda\envs\tensorflow\lib\site-packages\pip\_vendor\urllib3\response.py", line 438, in _error_catcher yiel…

gcc和g++区别

一、什么是GNU编译器? GNU编译器&#xff08;GNU Compiler Collection&#xff0c;简称GCC&#xff09;&#xff0c;是一套由自由软件基金会所发展的编程器。GCC支持多种编程语言&#xff0c;包括C、C、Objective-C、Fortran、Ada、以及其它一些语言。它是Linux系统和很多类U…

Zabbix监控硬盘S.M.A.R.T.信息教程

S.M.A.R.T.是"Self-Monitoring, Analysis, and Reporting Technology"的缩写&#xff0c;它是一种硬盘自我监测、分析和报告技术。硬盘S.M.A.R.T.信息的主要用途是帮助用户和系统管理员监测硬盘的健康状态和性能&#xff0c;例如温度、振动、读写错误率、坏道数量等&…

Linux 部署 MinIO 分布式对象存储 配置为 typora 图床

前言 MinIO 是一款高性能的对象存储系统&#xff0c;它可以用于大规模的 AI/ML、数据湖和数据库工作负载。它的 API 与Amazon S3 云存储服务完全兼容&#xff0c;可以在任何云或本地基础设施上运行。MinIO 是开源软件&#xff0c;也提供商业许可和支持 MinIO 的特点有&#x…

用Jmeter进行接口自动化测试的工作流程你知道吗?

在测试负责人接受到测试任务后&#xff0c;应该按照以下流程规范完成测试工作。 2.1 测试需求分析 产品开发负责人在完成某产品功能的接口文档编写后&#xff0c;在核对无误后下发给对应的接口测试负责人。测试负责人拿到接口文档需要首先做以下两方面的工作。一方面&#…

点云采样方法

随机采样&#xff0c;网格采样&#xff0c;均匀采样&#xff0c;集合采样。 网格采样&#xff1a;用规则的网格对点进行采样&#xff0c;不能精确的控制采样点的数量 均匀采样&#xff1a;均匀的采样点云中的点&#xff0c;由于其鲁棒性(系统的健壮性)而更受欢迎 点云降采样…

Windows11更新后Chrome无法打开解决方案

引言 最近更新了win11后&#xff0c;chrome突然抽风无法打开了&#xff0c;不知道是不是微软的锅&#xff0c;上网查询发现似乎有很多人最近碰到了相同的问题&#xff0c;试了试最为广泛传播的方案–更改manifest文件。然而在我这无效&#xff0c;索性直接重装&#xff0c;发现…

vscode搭建c/c++环境

1. 安装mingw64 2.vscode安装c/c插件&#xff0c;run插件 3.在workspace/.vscode文件夹下新建三个文件&#xff1a; 1&#xff09;c_cpp_properties.json { "configurations": [ { "name": "Win32", "includePath": [ "${wor…

CentOS8的nmcli常用命令总结

nmcli常用命令 # 查看ip&#xff08;类似于ifconfig、ip addr&#xff09; nmcli# 创建connection&#xff0c;配置静态ip&#xff08;等同于配置ifcfg&#xff0c;其中BOOTPROTOnone&#xff0c;并ifup启动&#xff09; nmcli c add type ethernet con-name ethX ifname ethX…

vue怎样封装接口

Vue可以使用axios来发送HTTP请求&#xff0c;通过封装axios可以实现接口的统一管理和调用。下面是一个简单的封装接口的示例。 安装axios 在项目中安装axios依赖&#xff0c;可以使用npm或者yarn命令进行安装。 npm install axios --save创建api.js文件 在项目中创建一个ap…

BACnet /IP转MQTT网关

在工业自动化和楼宇自动化领域中&#xff0c;Modbus、MQTT和BACnet/IP是三种常用的通信协议。Modbus是一种串行通信协议&#xff0c;常用于连接工业电子设备&#xff1b;MQTT是一种基于发布/订阅模式的轻量级通信协议&#xff0c;适用于远程监测和控制系统&#xff1b;BACnet/I…

代码注释对于程序员重要吗?

程序员对代码注释可以说是又爱又恨又双标……你是怎么看待程序员不写注释这一事件的呢&#xff1f; 代码注释的重要性 代码注释是指在程序代码中添加的解释性说明&#xff0c;用于描述代码的功能、目的、使用方法等。代码注释对于程序的重要性主要体现在以下几个方面&#x…

JSON数据处理工具-在线工具箱网站tool.qqmu.com的使用指南

导语&#xff1a;无论是处理JSON数据、进行文本数字处理、解码加密还是使用站长工具&#xff0c;我们都希望能够找到一个功能强大、简便易用的在线平台。tool.qqmu.com作为一款瑞士军刀般的在线工具箱网站&#xff0c;满足了众多用户的需求。本文将介绍tool.qqmu.com的多项功能…

什么是网络流量监控

随着许多服务迁移到云&#xff0c;网络基础架构的维护变得复杂。虽然云采用在生产力方面是有利的&#xff0c;但它也可能让位于未经授权的访问&#xff0c;使 IT 系统容易受到安全攻击。 为了确保其网络的安全性和平稳的性能&#xff0c;IT 管理员需要监控用户访问的每个链接以…

tcpdump(三)命令行参数讲解(二)

一 tcpdump实战详解 骏马金龙tcpdump详解 强调&#xff1a; 注意区分选项参数和过滤条件 本文继上篇 网卡没有开启混杂模式 tcpdump默认开启混杂模式 --no-promiscuous-mode --> 可以指定在非混杂模式抓包 ① -vv 控制详细内容的输出 ② -s -s 长度: 可以只…

【Python】概述

【Python】概述 特点 Python 是一种面向对象、解释性、弱类型&#xff08;动态数据类型&#xff09;的脚本语言&#xff08;高级程序设计语言&#xff09;。 由于Python是解释型语言&#xff0c;所以具有跨平台特性。 解释型语言&#xff1a; 这意味着开发过程中没有了编译…

Spring核心源码-如何解决循环依赖

假设有两个类A和B B是A的成员变量&#xff0c;A也是B的成员变量。 假设类A的bean为a&#xff0c;类B的bean为b。且IOC容器先处理A。 熟悉Spring容器初始化的同学&#xff0c;应该都知道&#xff0c;容器初始化的过程中&#xff0c;bean的创建是如下触发的&#xff1a; getBean…

23年基因蓝皮书略读

2023年基因慧蓝皮书略读 1.发展环境1.1 宏观环境1.2 基因产业内涵 2 应用场景2.1 生育支持与生育健康筛查2.2 老龄化与肿瘤精准防控2.2.1 肿瘤早筛2.2.2 肿瘤伴随诊断2.2.3 MRD检测2.2.4 生物药研发及基因科技 3 产业发展3.1 产业图谱及产业链分析拟上市肿瘤检测公司上市基因企…

PL/SQL拉链表

练习:-- 拉链表练习: 维度表源表 ID M_NAME REST UP_DATE 1 车贷 0.01 2022/12/1 2 房贷 0.03 2022/12/1 3 经营贷 0.015 2022/12/1 维度表拉链表 ID M_NAME REST BEGIN_DATE END_DATE 1 车贷 …