(三)行为模式:6、备忘录模式(Memento Pattern)(C++示例)

目录

1、备忘录模式(Memento Pattern)含义

2、备忘录模式的UML图学习

3、备忘录模式的应用场景

4、备忘录模式的优缺点

(1)优点:

(2)缺点

5、C++实现备忘录模式的实例


1、备忘录模式(Memento Pattern)含义

备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。【DP】

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

2、备忘录模式的UML图学习

 备忘录模式的主要角色包括:

(1)Originator(发起人):负责创建一个备忘录对象,用于记录当前对象的内部状态,并可以使用备忘录对象来恢复其状态。

(2)Memento(备忘录):用于存储Originator对象的内部状态。

(3)Caretaker(管理者):负责保存备忘录对象,但不能对备忘录对象进行修改或检查。

3、备忘录模式的应用场景

(1)需要保存和恢复对象的历史状态。

(2)需要提供撤销操作或者回滚操作的系统。

(3)需要对对象的状态进行快照并进行比较的系统。

4、备忘录模式的优缺点

(1)优点:

        1)提供了一种可靠的方式来保存和恢复对象的状态,避免了直接暴露对象的内部细节。

        2)备忘录对象与原始对象解耦,使得原始对象可以专注于业务逻辑,而不必关心状态的保存和恢复。

        3)可以灵活地扩展备忘录对象的功能,例如支持多个历史状态的保存和恢复。

(2)缺点

        1)如果原始对象的状态较大或者频繁改变,会占用较大的内存空间。

        2)在保存和恢复状态时,需要进行对象的序列化和反序列化操作,可能会影响性能。

5、C++实现备忘录模式的实例


#include <iostream>
#include <string>// 备忘录类
class Memento {
public:Memento(const std::string& state) : state_(state) {}std::string getState() const {return state_;}private:std::string state_;
};// 发起人类
class Originator {
public:void setState(const std::string& state) {state_ = state;}std::string getState() const {return state_;}Memento createMemento() {return Memento(state_);}void restoreMemento(const Memento& memento) {state_ = memento.getState();}private:std::string state_;
};// 管理者类
class Caretaker {
public:void saveMemento(const Memento& memento) {memento_ = memento;}Memento retrieveMemento() const {return memento_;}private:Memento memento_;
};int main() 
{Originator originator;Caretaker caretaker;// 设置初始状态originator.setState("State 1");std::cout << "Current state: " << originator.getState() << std::endl;// 保存状态caretaker.saveMemento(originator.createMemento());// 修改状态originator.setState("State 2");std::cout << "Current state: " << originator.getState() << std::endl;// 恢复状态originator.restoreMemento(caretaker.retrieveMemento());std::cout << "Restored state: " << originator.getState() << std::endl;return 0;
}

在上述示例中,Originator类表示发起人,Caretaker类表示管理者,Memento类表示备忘录。通过调用createMemento方法可以创建一个备忘录对象,并通过restoreMemento方法来恢复对象的状态。

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

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

相关文章

javaee spring 自动注入,如果满足条件的类有多个如何区别

如图IDrinkDao有两个实现类 方法一 方法二 Resource(name“对象名”) Resource(name"oracleDrinkDao") private IDrinkDao drinkDao;

C# task多线程创建,暂停,继续,结束使用

1、多线程任务创建 private void button1_Click(object sender, EventArgs e) //创建线程{CancellationToken cancellationToken tokensource.Token;Task.Run(() > //模拟耗时任务{for (int i 0; i < 100; i){if (cancellationToken.IsCancellationRequested){return;…

【C语言】每日一题(除自身以外数组的乘积)

添加链接描述&#xff0c;链接奉上 方法&#xff1a; 暴力循环:前缀积后缀积&#xff08;分组&#xff09;: 暴力循环: 暴力循换真的是差生法宝&#xff0c;简单好懂&#xff0c;就是不实用&#xff0c;大多数的题目都会超过时间限制&#xff08;无奈&#xff09; 思路&…

iOS开发Swift-2-图片视图、App图标-赏月App

1.创建新项目 点击File - New - Project。 选择Single View App&#xff0c;点击Next。 填写文件信息&#xff0c;点击Next。 选择文件位置&#xff0c;点击Create。 修改App显示名称为 “赏月”。 2.设置背景色 选择Main&#xff0c;点击View界面&#xff0c;选择右边属性&…

OLAP学习

OLAP又叫联机分析处理&#xff0c;联机分析处理(OLAP)的概念最早是由关系数据库之父E.F.Codd于1993年提出的。 当今的数据处理大致可以分成两大类&#xff1a;联机事务处理OLTP&#xff08;on-linetransactionprocessing&#xff09;、联机分析处理OLAP&#xff08;On-LineAna…

VS的调试技巧

Visual Studiohttps://visualstudio.microsoft.com/zh-hans/vs/ 目录 1、什么是调试&#xff1f; 2、debug和release 3、调试 3.1、环境 3.2、 快捷键 3.2.1、F10和F11 3.2.2、ctrlF5 3.2.3、F5与F9 3.2.3.1、条件断点 3.3、监视和内存观察 3.3.1、监视 3.3.2、内存 …

DSP_TMS320F28377D_算法加速方法2_添加浮点运算快速补充库rts2800_fpu32_fast_supplement.lib

继上一篇博客DSP_TMS320F28377D_算法加速方法1_拷贝程序到RAM运行_江湖上都叫我秋博的博客-CSDN博客之后&#xff0c;本文讲第二种DSP算法加速的方法&#xff0c;该方法的加速效果很明显&#xff0c;但是加速范围仅限于32位浮点数下面这几种函数: 1 工程师的关注点 下面稍微解…

爬虫实战之使用 Python 的 Scrapy 库开发网络爬虫详解

关键词 - Python, Scrapy, 网络爬虫 在信息爆炸时代&#xff0c;我们每天都要面对海量的数据和信息。有时候我们需要从互联网上获取特定的数据来进行分析和应用。今天我将向大家介绍如何使用 Python 的 Scrapy 库进行网络爬虫&#xff0c;获取所需数据。 1. Scrapy 简介 1.1 …

设计模式--装饰者模式(Decorator Pattern)

一、什么是装饰者模式&#xff08;Decorator Pattern&#xff09; 装饰者模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你在不修改现有对象的情况下&#xff0c;动态地将新功能附加到对象上。这种模式通过创建一个包装类&#xff0c;…

Mysql45讲学习笔记

前言&#xff1a;这篇文章主要总结事务&#xff0c;锁、索引的一些知识点&#xff0c;然后分享一下自己学习小心得&#xff0c;我会从点到线在到面展开说说&#xff0c;对于学习任何知识&#xff0c;我们都应该藐其全貌&#xff0c;不要一开始就选入细节 基础 一、基础架构&a…

并发容器11

一 JDK 提供的并发容器总结 JDK 提供的这些容器大部分在 java.util.concurrent 包中。 ConcurrentHashMap: 线程安全的 HashMap CopyOnWriteArrayList: 线程安全的 List&#xff0c;在读多写少的场合性能非常好&#xff0c;远远好于 Vector. ConcurrentLinkedQueue: 高效的并…

第十七课:利用 Setup Factory 制作 Qt 软件安装包

功能描述&#xff1a;详细介绍如何利用 Setup Factory 制作 Qt 软件安装包&#xff0c;从 Setup Factory 软件下载、安装&#xff0c;到如何利用 Setup Factory 制作软件安装包&#xff0c;手把手教你将 Qt 应用程序制作成具有安装向导的安装包。 一、Setup Factory 简介 Setu…