前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我用过的设计模式(9)-- 备忘录模式

我用过的设计模式(9)-- 备忘录模式

作者头像
看、未来
发布2022-05-18 13:48:04
1780
发布2022-05-18 13:48:04
举报
文章被收录于专栏:CSDN搜“看,未来”
在这里插入图片描述
在这里插入图片描述

文章目录

如果能重来

“如果能重来,我要选李白···”,“曾经有一份····”,“多渴望能够 找到一条时光隧道,重回到简单,容易觉得美好”,“我靠,我被Boss打死了,还好我有存档”····

哈哈哈,如果时光能倒流,那该能圆了我们多少遗憾。如果能重来,我决不会在你最重要的那段时间离开,回头也已经于事无补了。

在从程序设计中,有一个“美名昭著”的“重来”,对,就是栈。

不过栈嘛,好用是固然的,但它和我们今天要讲的“备忘录模式”并不相冲,反而,还是相辅相成的呢。

“时光隧道”

我也曾写过一些需要保存临时数据的功能,但是写那些功能的时候是真的烦躁,因为我需要创建很多的对象,然后将数据一个一个塞进去,取出来的时候又要将数据一个一个进行输出,这让我感觉很不爽。不仅仅是工作量大,代码重复度又高,关键是有些数据,它明明应该是私有变量,就这样变成了公有变量,这让我很相当不满意,毕竟有谁会愿意把自己的美好回忆公开呢?

这时候我们就需要使用一些技巧,在不破坏封装性的前提下,将内部数据取出,存放,后期恢复。

这里我们需要学习一下”备忘录模式“的整体思路:

在这里插入图片描述
在这里插入图片描述

Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可以使用备忘录恢复内部状态。Originator可以根据需要决定Memento的存储内容。

Memento(备忘录):负责存储Originator的内部状态,并可防止Originator以外的对象访问备忘录。备忘录有两个接口,Carataker只能看到备忘录的窄接口。

Caretaker(管理者):负责保存好备忘录,不能对备忘录内容进行操作或检查。

代码实现

代码语言:javascript
复制
#include<iostring>
#include<string>	//以此替代结构体,结构体要自己定义

using namespace std;
代码语言:javascript
复制
//备忘录
class Memento{
private:
	string State;//状态,建议使用结构体存储

public:
	Memento(string value){State = value;}
	string get_State(return State;);
}
代码语言:javascript
复制
//发起人

class Originator{
private:
	string State;	//状态,建议使用结构体存储

public:
	string get_state(){return State;}	
	void set_state(string value){State = value;}
	
	Memento Create_Memento(){return (new Memento(State));}	//创建备忘录,将当前需要的信息导入并实例化出一个Memento对象
	void set_memento(Memento *memento){State = memento->get_State();}	//恢复备忘录

	void show(){cout<<State<<endl;}	//显示数据	
};
代码语言:javascript
复制
//管理者类
class Caretaker{
private:
	Memento *memento;

public:
	Memento get_Memento(){return memento;}	//得到备忘录
}
代码语言:javascript
复制
//主函数

int main()
{
	Originator *o = new Originator();
	o->set_state("A");
	o->show();

	Caretaker *c = new Caretaker();
	c->memento = o.Create_Memento();//保存状态。有管理类挡在前面,很好的隐藏了备忘录类的实现细节

	o->set_state("B");	//更改状态
	o->show();
	
	o->set_memento(c->memento);	//恢复状态,解释同上
	o->show();
}

应用场景

你懂得。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 如果能重来
  • “时光隧道”
  • 代码实现
  • 应用场景
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档