学以致用C++设计模式 之 “备忘录模式”

时间:2022-07-23
本文章向大家介绍学以致用C++设计模式 之 “备忘录模式”,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

春花秋月何时了,往事知多少?

往事不堪回首,月如钩。寂寞梧桐深院锁清秋。春花秋月何时了,往事知多少?小楼昨夜又东风,故人不堪回首,月明中。

我记性不好,所以很多事情都要做备忘录,像一些回忆、照片、日常聊天、物件,虽然知道那些时光是回不去了,但是以前还是希望能回得去的。

这个备忘录有个什么优点呢?它有时间戳啊,想回到哪天就回到哪天。它还增删自由啊,当然,改是不允许改了,为了保证回忆的纯净。

我的好兄弟啊钒,总是说我放不下,其实也没啥放不下的,前两周不就放下了嘛,我把以前相关的备忘录全删了,也是该开始新的生活了,一直困在过去,画地为牢,有什么意思呢?

生活如此,程序也是如此,备忘录模式是一个很常用的模式,或者说,备忘录的功能是很多人都需要实现的,也有些人想实现却不知道怎么实现,嫌麻烦。不然我上一篇备忘录,也不至于就那么点访问量有那么高收藏量。

来,我教你实现备忘录。首先要有几个什么元素呢? 首先你要有想存的东西,这不是废话嘛,这个东西要支持存储;其次你得有个容器,也就是管理者(比方说U盘),实现了存、取、查、删等该实现的功能,我的U盘还支持加密呢;最后,就是执行存取操作的人,这个人,他学问也不少,比方说这个U盘啊,是不是加密,是不是只有你一个人能访问是吧,那就又涉及到密保了。

来张图吧,看的直观。

代码实现

#include<iostring>
#include<string>	//以此替代结构体,结构体要自己定义

using namespace std;

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

public:
	Memento(string value){State = value;}
	string get_State(return State;);
}

//发起人

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;}	//显示数据	
};

//管理者类
class Caretaker{
private:
	Memento *memento;

public:
	Memento get_Memento(){return memento;}	//得到备忘录
}

//主函数

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();
}

感悟

如果要加多个备忘录,可以在管理者类中放上容器,自己实现。 被上面那个类中类搞晕了,哈哈哈,难搞啊。

备忘录模式之使用场景

在不破坏封装性的前提下,获取一个对象的状态,并将这个状态保存在类外,这样以后就可以恢复这个状态。

使用场景

  • 需要保存数据和恢复数据的相关场景。
  • 提供一个可回滚的操作。
  • 需要监控的副本场景中。

注意事项

备忘录的生命周期,要主动管理它的生命周期,不使用就删了。 备忘录的性能:不要在频繁建立备份的场景中使用备忘录模式,因为控制不了备忘录建立的数量。