[设计模式]备忘录模式(Memento)

保姆级教程:用STM32H743+TJA1042T玩转FDCAN,CubeMX配置1M/5M双速率通信(附完整代码) 本文提供STM32H743与TJA1042T实现FDCAN双速率通信的保姆级教程,详细讲解CubeMX配置1M/5M双速率通信的全过程,包括硬件连接、时钟树配置、过滤器设置及中断管理,并附完整代码示例,助力开发者快速掌握FDCAN高速通信技术。 阅读详情

1.意图

       在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以将以后的对象状态恢复到先前保存的状态。

2.动机

       有时有必要记录一个对象的内部状态。为了允许用户取消不确定的操作或从错误中恢复过来,需要实现检查点和取消机制,你必须事先将状态信息保存在某处,这样才能将对象恢复到它们先前的状态。但是对象通常封装了其不封或所有的状态信息,使得其状态不能被其他对象访问,也就不可能在该对象之外保存其状态。而暴露其内部状态又将违反封装的原则,可能有损应用的可靠性和可扩展性。

3.结构与参与者


4.效果

1)保持封装边界

        使用备忘录就是为了封装原发其的信息,这样既可返回原来的状态,也使得信息不暴露。面向接口编程。

2)它简化了原发器

        在其他的保持封装性的设计中,Originator负责存储客户请求存储的原始状态。现在由Memento类进行存储。

3)使用备忘录可能代价很高(缺)

       如果存储的信息过大,或者操作过于频繁,那么开销会很大,此时备忘录模式就不太合适了。

4)定义窄接口和宽接口

       在一些语言中可能难以保证只有原发器可访问备忘录的状态。

5)维护备忘录的潜在代价(缺)

       管理器负责删除它所能维护的备忘录。然而管理器不知道备忘录中有多少个状态。因此当存储备忘录时,一个本来很小的管理器,可能会产生大量的存储开销。

5.实现

1)语言支持

        备忘录有两个接口:一个为原发其所使用的宽接口,一个为其他对象所使用的窄接口。理想的实现语言应可支持两级的静态保护。在C++中,可将Originator作为Memento的一个友元,并使Memento宽接口为私有,只有窄接口应该被声明为公共的。

2)存储增量式改变

         如果备忘录的创建及其返回(给它们的原发器)的顺序是可预测的,备忘录可以仅存储原发起内部状态的增量改变。

6.代码示例

#include <iostream>
#include <string>
using namespace std;

class Memo;
//封装的数据
class State
{
public:
	State(int health,int attack,int defense):m_health(health),m_attack(attack),m_defense(defense){}
	int GetHealth(){return m_health;}
	int GetAttack(){return m_attack;}
	int GetDefense(){return m_defense;}
	void SetHealth(int health){m_health=health;}
	void SetAttack(int attack){m_attack=attack;}
	void SetDefense(int defense){m_defense=defense;}
private:
	int m_health;
	int m_attack;
	int m_defense;
};
//发起人类
class Originator
{
public:
	Originator(State* state):_state(state){}
    Memo* CreateMemo();
	State* GetState()
	{
		return _state;
	}
	void SetMemo(Memo* memo);
	void Show()
	{
		cout<<"生命值:"<<_state->GetHealth()<<endl;
		cout<<"攻击力:"<<_state->GetAttack()<<endl;
		cout<<"防御力:"<<_state->GetDefense()<<endl;
	}
private:
	State* _state;
};

//备忘录类
class Memo
{
public:
	Memo(State* state)
	{
		_state=new State(state->GetHealth(),state->GetAttack(),state->GetDefense());
	}
private:
	friend class Originator;
	State* GetState()
	{
		return _state;
	}
	State* _state;
};

Memo* Originator::CreateMemo()
{
	return new Memo(_state);
}

void Originator::SetMemo(Memo* memo)
{
	_state = memo->GetState();
}

//管理者类
class Caretaker
{
public:
	Memo* memo;
};
//客户端:
int main()
{	
	void FightBoss(Originator* on);
	State* pState=new State(1000,200,100);
	Originator* on=new Originator(pState);
	Caretaker* ct=new Caretaker();
	cout << "人物初始化完成"<<endl;
	on->Show();
	ct->memo = on->CreateMemo();
	cout << "存档完成"<<endl;
	FightBoss(on);
	on->Show();
	cout << "加载存档"<<endl;
	on->SetMemo(ct->memo);
	on->Show();

	return 0;
}
void FightBoss(Originator* on)
{
	on->GetState()->SetHealth(0);
	on->GetState()->SetAttack(0);
	on->GetState()->SetDefense(0);
	cout << "对抗BOSS"<<endl;
}


Python手记-9:Python LXML库XPath的爬取晋江书目 1. lxml库 lxml是功能最丰富且易于使用的库,用于处理Python语言中的XML和HTML,还可实现WEB爬取,官文参考:https://lxml.de/,完整的PDF文档下载链接https://lxml.de/lxmldoc-4.5.0.pdf,但是阅读起来……em……怪自己不够聪明的样子。 Linux下安装lxml库:[root@chengyu ~]# pip3 instal... 阅读详情

相关推荐

Windows下用Docker快速搭建SearXNG私有搜索引擎(附Dify集成配置)

本文详细介绍了在Windows环境下使用Docker快速搭建SearXNG私有搜索引擎的完整流程,包括环境准备、容器化部署、安全配置优化以及与Dify平台的深度集成方法。通过分步指导和实用配置示例,帮助开发者构建兼具隐私保护和AI增强能力的本地化搜索解决方案,特别适合需要定制化搜索服务的应用场景。

weixin_30300225的博客 336

深入浅出Java设计模式之备忘录模式

深入浅出Java设计模式之备忘录模式http://dev.21tx.com 2005年08月15日 Blog ai92 一、引子   俗话说:世上难买后悔药。所以凡事讲究个“三思而后行”,但总常见有人做“痛心疾首”状:当初我要是……。如果真的有《大话西游》中能时光倒流的“月光宝盒”,那这世上也许会少一些伤感与后悔——当然这只能是痴人说梦了。  但是在我们手指下的程序世界里,却有的后悔药买。今天我们

liangevan的专栏 929

用CesiumLab2+nginx零成本构建三维地形服务:从DEM数据到浏览器渲染全流程

本文详细介绍了如何利用CesiumLab2和nginx零成本构建私有三维地形服务的完整流程。从获取DEM数据、使用CesiumLab2进行格式转换,到配置nginx服务器并重点解决跨域问题(Access-Control-Allow-Origin),最终实现在Cesium中流畅加载与渲染自定义地形,为内网或涉密项目提供了高性价比的解决方案。

weixin_29300931的博客 117

Java设计模式笔记之备忘录模式

1.前言 备忘录模式是一种行为模式,备忘录模式实现的方式需要保证被保存的对象状态不能被对象从外部访问,目的是为了保护好被保存的这些对象状态的完整性以及内部实现不向外暴露。 2.定义 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 3.UML图 Originator:负责创

ITMonkeyKing的博客 334

企业IT运维实录:批量部署银河麒麟V10-SP1,Ghost镜像与UKey激活实战

本文详细介绍了企业级银河麒麟V10-SP1操作系统的批量部署全流程,包括标准化镜像制作、自动化封装技术、网络化部署方案及UKey集群激活方案。通过实战案例和技术要点解析,帮助企业IT运维团队大幅提升部署效率,确保系统安全与稳定性。

weixin_30729609的博客 387

Gamit 数据处理,相关的文件配置

一、处理前准备 1、在主文件夹内新建test项目文件,项目内新建brdc、igs和rinex三个文件夹,分别存放广播星历,精密星历几观测值文件,所用的命令分别为sh_get_nav、sh_get_orbits和sh_get_rinex (若文件为.Z,用gunzip命令解压,若仍为d,用命令sh_crx2rnx -f 命令解压为o文件) 2、进入test项目文件夹,链接tables,运行 sh_setup -yr 2015 -apr itrf08_com.apr 3、生成station.info文件。 将t

CodeDoraemon的博客 3375

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

备忘录模式是一种行为设计模式, 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。

TechNomad的博客 954

iOS 取证窍门:为什么要先从 Recovery 恢复模式开始?

未记录的 DFU 代表“设备固件升级”。与专为普通用户设计的恢复模式不同,DFU 模式从来都不是为公众设计的。Apple 知识库中的任何地方都没有关于 DFU 的文档。进入 DFU 的方法主要是通过按下、按住和释放按钮的复杂操作序列,并具有精确的时间限制。在多个步骤中的任何一个步骤中,如果时间错误,都会导致重新启动设备,而不是将其切换到 DFU。另外,设备屏幕上也没有 DFU 模式的指示。如果设备成功切换到 DFU,显示屏将保持黑色。即使对于专家来说,进入 DFU 模式也可能很困难。恢复模式是最容易解释的。

2302_82041293的博客 1198

设计模式 21 备忘录模式 Memento Pattern

备忘录模式是一种行为型设计模式,它允许你将一个对象的状态保存到一个独立的“备忘录”对象中,并在之后恢复到该状态。备忘录模式是一种强大的设计模式,可以帮助我们实现状态的保存和恢复功能。在使用备忘录模式时,需要注意封装性、管理、性能、安全性以及使用场景等方面,以确保其有效性和安全性。

jxusthusiwen的专栏 1130

【Python百日进阶-Web开发-Feffery】Day385 -“一起Dash”训练营Lesson-07_利用fac构建表单(上)

文章目录前言:fac是什么?“人生苦短,我用Python;Web开发,首选Feffery!”↓↓↓ 今日笔记 ↓↓↓一、费老师课堂1.1 什么是表单1.2 页面效果1.3 课堂源码二、课后作业2.1 页面效果2.2 项目源码 前言:fac是什么? feffery-antd-components(简称fac),是国内大佬费弗里(Feffery)老师基于著名的React UI组件库ant design进行二次开发,将ant design中的诸多实用组件及特性引入Dash,帮助开发者使用极低的纯Python代

专注于医院数据分析技术与系统开发的创作与分享。 251

uniapp [安卓苹果App端] - 实现获取手机日历读写权限+调用本机日历数据及操作功能+日历中插入事项事件提醒,检测权限手机日历权限是否开启并引导用户同意授权,uniApp app端开启日历授权

uni-app,权限,手机日历权限,安卓Android,苹果ios,uniapp安卓android获取本机日历读写权限使用,uni-app获取日历权限并实现插入事项事件功能 uniapp苹果IOS系统不支持怎么办,判断权限,权限被拒绝了怎么办,获取日历权限报错,读取日历数据农历阴历并操作插入移除,给用户手机日历中放入一条提示,UniApp调用日历进行读写,打包上架后如何获取,安卓ios权限检测,安卓和ios权限获取,uniapp的APP端日历读写权限与使用示例代码,如何开启日历权限,日历的新增事项和删除,判

🏆 前端领域优质创作者 1万+

【C#设计模式】22.备忘录模式(Memento Pattern)【行为型】

在软件构建过程中,某些对象的状态在转换的过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。 如何实现对象状态的良好保存与恢复,但同时又不会因此而破坏对象本身的封装性? .........

星Yeah 的博客 1642

手把手教您windows如何正确的开启局域网共享,如何解决“没权限、空密码访问等诸多问题”,含手动操作教程 + 傻瓜式一键设置工具(局域网共享+打印机管理),二选一总有一款能满足您!

😫 Windows共享总失败?别抓狂!这篇教程带你破解“空密码”访问的核心难题 🔑,四步搞定所有设置。文末还附赠“一键修复”神器 🚀,让文件共享丝滑如德芙!

XiaoqiangClub的博客 1452

设计模式——备忘录模式(Memento Pattern)

行为型模式保存一个对象的某个状态,以便在适当的时候恢复对象。

码鹿的记录 715

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

秒懂设计模式之备忘录模式(Memento Pattern)

[版权申明] 非商业目的注明出处可自由转载 博文地址: 出自:shusheng007 设计模式汇总篇,强烈建议要点赞收藏: 永不磨灭的设计模式(有这一篇真够了,拒绝标题党) 概述 备忘录模式听起来特别高深,其实可能写过几年代码的都不知不觉的用了很多次了。模式的名称其实已经很形象的反映出其作用了:就是为了在某一时刻把当前的状态记录下来,以后再恢复到那时的状态。 类型 行为型(behavioral) 难度 2颗星 定义 在不破坏封闭的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,从而可以将对象.

ShuSheng007的程序人生 2130

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

23种设计模式之备忘录模式(Memento Pattern)

本篇文章将23种设计模式中的备忘录模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java设计模式——备忘录模式【Memento Pattern】

Java设计模式、备忘录模式、Memento Pattern

scorpio的博客 373

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 备忘录模式(Memento Pattern) - Java实现

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 备忘录模式(Memento Pattern) 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

Z 416

设计模式-备忘录模式-Memento Pattern

在备份之前,对数据进行哈希摘要,只有当哈希值发生变化时才进行备份,这样可以避免不必要的备份操作。

wesigj的博客 2109

设计模式-16备忘录模式Memento Pattern

摘要:备忘录模式 (Memento Pattern) 备忘录模式是一种行为设计模式,用于在不破坏对象封装的前提下保存和恢复对象状态。它通过三个核心角色实现:Originator(原发器)负责创建和恢复状态、Memento(备忘录)存储状态快照、Caretaker(管理者)管理备忘录历史记录。该模式适用于需要实现撤销/重做功能、事务回滚或状态检查点的场景,如文本编辑器保存历史版本。典型实现中,Originator创建包含当前状态的Memento对象,Caretaker维护这些备忘录栈以实现状态回溯,整个过程保

d3y1`5 81_09 1018

每天一个设计模式之备忘录模式(Memento Pattern)

顾名思义,备忘录就是保存一个状态,到需要的时候可以恢复到某一时刻的状态。

Dive Deep into The Knowledge 420

设计模式学习—备忘录模式(Memento Design Pattern)

设计模式之备忘录模式,行为型模式

闲鱼的博客 549

C++设计模式——备忘录模式(memento pattern)

博主看了许多文章和一些书,发现要么代码不全,要么对备忘录的理解有偏差,要么干脆根本就不是备忘录模式,经过博主查阅十余篇文章和详细研究书本备忘录模式,总结出这篇精华的c++备忘录模式文章,感兴趣的朋友可以阅读和提出建议。 # 一、原理讲解 别名Token。 ## 1.1意图 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

净无邪博客 1482

设计模式-10 - Memento Design Pattern

备忘录模式是一种设计模式,它允许在不破坏封装性的情况下捕获和恢复对象的内部状态。其结构:Originator:创建和管理备忘录的对象。Memento:存储 Originator 状态的备忘录对象。Memento 对象是不可变的。Caretaker:存储 Memento 对象,而不了解其实际内容。示例:一个文本编辑器可以使用备忘录模式来存储文档的状态,以便用户可以撤消和重做编辑操作。

jxusthusiwen的专栏 684

设计模式教程:备忘录模式(Memento Pattern)

在不暴露对象实现细节的情况下,保存一个对象的内部状态,并在需要时恢复该状态。

遇见伯灵说的博客 1096

设计模式-备忘录模式(Memento Pattern)

备忘录模式 定义 Without violating encapsulation, capture and externalize an object’s internal state so that the object can be restored to this state later. 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到...

kaven 1414
上一篇: [设计模式]观察者模式(Observer)
下一篇: [设计模式]组合模式(Compostie)
sicofield
博客等级 码龄18年 169粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值