设计模式--备忘录模式

备忘录模式是一种行为设计模式,它用于在不破坏封装的前提下,保存一个对象的内部状态,以便以后可以恢复到这个状态。这种模式在许多应用场景中非常有用,例如在实现撤销操作、保存游戏进度、恢复文件备份以及保持工作状态等。

备忘录模式的应用场景

  1. 实现撤销操作:当需要实现撤销功能时,可以使用备忘录模式来保存操作的状态,以便在需要时可以恢复到之前的某个状态。
  2. 保存游戏进度:当需要保存游戏进度以便玩家可以在稍后继续游戏时,可以使用备忘录模式来保存游戏状态。
  3. 恢复文件备份:当需要备份文件,并在需要时可以恢复到备份状态时,可以使用备忘录模式来保存文件的状态。
  4. 保持工作状态:当需要保存应用程序的状态,以便在需要时可以恢复到之前的工作状态时,可以使用备忘录模式来保存状态。

使用技巧与注意事项

  1. 定义备忘录接口:为了使用备忘录模式,需要定义一个备忘录接口,该接口包含保存和恢复状态的方法。
  2. 避免滥用:如果对象的状态变化不是很重要,可能不需要使用备忘录模式,直接保存对象的状态即可。

C++代码示例

下面是一个使用C++编写的备忘录模式示例代码:

#include <iostream>
#include <string>
// 备忘录接口
class Memento {
public:virtual ~Memento() {}
};
// 具体备忘录类
class ConcreteMemento : public Memento {
private:std::string state;
public:ConcreteMemento(std::string state) : state(state) {}std::string getState() {return state;}
};
// 发起者类
class Originator {
private:std::string state;
public:void setState(std::string state) {this->state = state;}std::string getState() {return state;}Memento* createMemento() {return new ConcreteMemento(state);}void setMemento(Memento* memento) {state = static_cast<ConcreteMemento*>(memento)->getState();}
};
// 备忘录管理者类
class Caretaker {
private:Memento* memento;
public:void setMemento(Memento* memento) {this->memento = memento;}Memento* getMemento() {return memento;}
};
int main() {Originator* originator = new Originator();originator->setState("State 1");std::cout << "Originator's state: " << originator->getState() << std::endl;Caretaker* caretaker = new Caretaker();caretaker->setMemento(originator->createMemento());originator->setState("State 2");std::cout << "Originator's state: " << originator->getState() << std::endl;originator->setMemento(caretaker->getMemento());std::cout << "Originator's state after restoring: " << originator->getState() << std::endl;delete originator;delete caretaker;return 0;
}

在这个示例中,我们定义了一个备忘录接口 Memento,它声明了保存和恢复状态的方法。具体备忘录类 ConcreteMemento 实现了这些方法,并保存了状态。发起者类 Originator 提供了设置和获取状态的方法,并创建了一个备忘录对象。备忘录管理者类 Caretaker 负责设置和获取备忘录对象。客户端代码首先创建发起者对象,然后创建备忘录管理者对象,并保存状态。通过这个示例,我们可以看到备忘录模式在C++中的实现。
总之,备忘录模式是一种非常有用的设计模式,它可以帮助我们保存对象的状态,并在需要时可以恢复到之前的状态。在实际开发中,我们需要根据具体的应用场景来选择是否使用备忘录模式,并注意相关的使用技巧和注意事项。

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

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

相关文章

linux中ansible整理笔记

一、工作模式 1. adhoc临时命令 语法&#xff1a; ansible 主机或者组列表 -m 模块 -a “参数” 2. playbook 语法&#xff1a; ansible-playbook xxx.yml 二、模块 1. ping 2.command:默认模块&#xff08;不支持重定向&#xff0c;管道&#xff09; 3.shell:类似com…

IP地址显示“不安全”怎么办|已解决

解决IP地址显示“不安全”的问题&#xff0c;通常需要确保网站或服务使用HTTPS协议进行加密通信&#xff0c;可以通过部署SSL证书来解决&#xff0c;以下是具体的解决步骤&#xff1a; 1 申请IP地址SSL证书&#xff1a;网站管理员应向证书颁发机构&#xff08;CA&#xff09;申…

网络拓扑—WEB-IIS服务搭建

文章目录 WEB-IIS服务搭建网络拓扑配置网络IISPC 安装IIS服务配置IIS服务&#xff08;默认站点&#xff09;PC机访问网页 配置IIS服务&#xff08;新建站点&#xff09;PC机访问网页 WEB-IIS服务搭建 网络拓扑 //交换机忽略不计 IIS服务IP&#xff1a;192.168.1.1 PC机IP&…

人类交互2 听觉处理和语言中枢

人类听觉概述 人类听觉是指通过耳朵接收声音并将其转化为神经信号&#xff0c;从而使我们能够感知和理解声音信息的能力。听觉是人类五种感觉之一&#xff0c;对我们的日常生活和交流至关重要。 听觉是人类交流和沟通的重要工具。通过听觉&#xff0c;我们能够听到他人的语言…

安装错误提示Please run MaterialLibrary2018.msi first或者其他MaterialLibrary版本

打开autoremove&#xff0c;系统检查&#xff0c;点击开始检查。检查完成修复。 可以解决部分该问题&#xff0c;如果没解决的请咨询

Linux中的文件描述符

1.系统调用接口和库函数的关系 函数&#xff1a;fopen fclose fread fwrite 都是c标准库当中的函数&#xff0c;也就是用户操作接口中ibc系统调用&#xff1a;open close read write 都是系统调用提供的接口 c语言中接口底层封装的都是系统调用接口 FILE* stdin stdout stderr…

[POI2008] STA-Station/洛谷P3478(树形dp)

[ P O I 2008 ] S T A − S t a t i o n ( 树形 d p ) \Huge{[POI2008] STA-Station(树形dp)} [POI2008]STA−Station(树形dp) 题目链接&#xff1a;[P3478 POI2008] STA-Station - 洛谷 文章目录 题意思路标程 题意 给定一个 n n n个点的树&#xff0c;请求出一个结点&#…

js无感删除url搜索部分,不刷新页面

如&#xff1a;把下面的网址 http://127.0.0.1:5173/?code3b9cc36e&state 改成 http://127.0.0.1:5173 history.pushState(null, 网站标题, location.origin)

TikTok越狱检测之二 <调试器检测>

来了&#xff0c;调试器检测。总结如下,多多指教: 检测app 是否被附加调试: 原理就是检测父进程是否 launchd启动&#xff0c;在OS X和iOS 系统中&#xff0c;用户环境始于launchd&#xff0c;为用户态出现的第一个进程&#xff0c;为所有的进程的祖先&#xff0c;launchd 的进…

Python模块、包和异常处理

大家好&#xff0c;在当今软件开发领域&#xff0c;Python作为一种简洁、易读且功能强大的编程语言&#xff0c;被广泛应用于各种领域。作为一名测试开发工程师&#xff0c;熟练掌握Python的模块、包和异常处理是提高代码可维护性和错误处理能力的关键。本文将和大家一起探讨Py…

SAP-MRP和采购申请

1、如果采购申请是手工创建的,跑MRP会不会被覆盖? 创建一个采购申请18089476,然后运行MRP-MD03,再用MD04查看下 从上图看,手工创建的采购申请被打上*号,没有被覆盖掉。 2、如果采购申请被审批了,会不会被覆盖掉? 首先创建一个独立需求MD61 然后库存消耗掉为0,运行M…

shell实现ssh服务防止暴力破解 —— 筑梦之路

实现原理 对系统登陆日志文件/var/log/secure&#xff0c;进行数据筛选&#xff0c;查找登陆失败的ip地址&#xff0c;然后将ip加入到黑名单中。 脚本内容 #!/bin/bash# 获取登陆失败的ip地址failedcat /var/log/secure|grep "Failed"|awk {print $11}|sort|uniq …

普源精电收购耐数电子——用“钞能力”拿下“量子”?

「量子市界」聚焦量子前沿&#xff0c;揭秘市场动态┃2024年4月30日&#xff0c;普源精电新增“量子科技”概念。 似乎一夜之间&#xff0c;新增“量子科技”概念的上市企业如雨后春笋般登场——普源精电就是其一。普源精电本就持有耐数电子32.26%股权&#xff0c;于4月2日发布…

c4d云渲染是工程文件会暴露吗?

在数字创意产业飞速发展的今天&#xff0c;C4D云渲染因其高效便捷而备受欢迎。然而&#xff0c;随着技术应用的深入&#xff0c;人们开始关注一个核心问题&#xff1a;在享受云渲染带来的便利的同时&#xff0c;C4D工程文件安全吗&#xff1f;是否会有暴露的风险&#xff1f;下…

【如何让论文中摘要后面的内容不出现在目录中】

首先选择摘要二字&#xff0c;设置为一级标题&#xff0c;然后选择摘要后面的内容设置为正文样式&#xff0c;再选择这一部分看一下是不是都是正文大纲级别&#xff0c;如果是那就可以了。 具体流程如下 1、选择摘要二字&#xff0c;设置为一级标题样式 2、选择摘要后面的文…

x264 码率控制原理:rate_estimate_qscale 函数

rate_estimate_qscale 函数 原理 函数功能:根据目前使用的实际比特数更新一帧的qscale;是一个复杂的决策过程,需要考虑多种因素,如帧类型、编码的复杂度、目标比特率、缓冲区大小等,以确保视频质量和文件大小之间的平衡。函数参数分析:x264_t *h :编码器上下文信息结构…

扩散模型学习1

DDPM 总体训练原理 https://www.bilibili.com/video/BV1nB4y1h7CN/?spm_id_from333.337.search-card.all.click&vd_sourcef745c116402814185ab0e8636c993d8f 讲得很好&#xff1a;每次都是输入t和noise-x的图像&#xff0c;预测noise之后得到和加入的noise比较&#xff1b…

LLM实战:当网页爬虫集成gpt3.5

1. 背景 最近本qiang~关注了一个开源项目Scrapegraph-ai&#xff0c;是关于网页爬虫结合LLM的项目&#xff0c;所以想一探究竟&#xff0c;毕竟当下及未来&#xff0c;LLM终将替代以往的方方面面。 这篇文章主要介绍下该项目&#xff0c;并基于此项目实现一个demo页面&#x…

Java并发: 锁和同步

在Java并发: 面临的挑战那一篇中我们提到锁和同步是实现并发安全(可见性/原子性)的方法之一。这一章我们来讲讲Java中的锁和同步的各种工具&#xff0c;包括: LockSupportAbstractQueuedSynchronizerJava内置的锁实现 1. LockSupport LockSupport是基于Unsafe的park/unpark实…

智能禁区监控:计算机视觉在人员禁区闯入检测中的应用

基于视觉分析的人员禁区闯入行为检测算法主要依赖于计算机视觉技术和深度学习算法。这些技术结合高性能的摄像头和图像处理硬件&#xff0c;实现了对监控区域内人员行为的自动识别和分析。具体来说&#xff0c;这种检测算法利用摄像头捕捉的视频数据&#xff0c;通过深度学习模…