天天看点

c++ 设计模式23讲之备忘录模式备忘录模式实现:总结

可以用友元来实现对私有成员的访问

备忘录模式

定义:

不破坏封装前提下捕获一个对象的内部状态,并在对象之外保存,从而使对象能在以后恢复到该状态

优点:

(1)实现一种恢复机制,对象可回溯到先前状态

(2)可采用集合方式实现多次回溯操作

缺点:

(1)资源消耗过大,有众多的临时对象需要分配和跟踪

使用范围:

需要保存一个对象全部或者部分状态,且会触发回撤情况

如: 文档编辑器的回退crtl+z

结构:

rpg:需回溯对象类

status:状态类,保存可回溯对象一瞬间内部状态

memento_pattern:状态管理类,保存和提供状态对象

c++ 设计模式23讲之备忘录模式备忘录模式实现:总结

实现:

namespace behavioral_pattern
{
	class status
	{
	public:
		void set(std::string str) { this->status_info = str; }
		std::string get() { return this->status_info; }
	private:
		std::string status_info;
	};
	class memento_pattern
	{
	public:
		void push(status st)
		{
			stack_status.push(st);
		}
		status pop()
		{
			status temp;
			if (!stack_status.empty())
			{
				temp = stack_status.top();
				stack_status.pop();
			}
			return temp;
		}
	private:
		std::stack<status> stack_status;
	};
	class rpg
	{
	public:
		void set(std::string str) { this->status_info = str; }
		std::string get() { return this->status_info; }
		status save()
		{
			status st;
			st.set(this->status_info);
			return st;
		}
		void restore(status& st)
		{
			this->status_info = st.get();
		}
	private:
		std::string status_info;
	};
}           

测试:

基于GoogleTest 的单元测试框架;框架可参考如下网址:

https://www.cnblogs.com/jycboy/p/gtest_catalog.html

using namespace behavioral_pattern;
TEST(test_memento_pattern_save_restore, success_stack)
{
	memento_pattern memento; 
	rpg r;
	r.set("qwwer");
	memento.push(r.save());
	r.set("assdf");
	std::cout << r.get().c_str() << std::endl;

	r.restore(memento.pop());
	std::cout << r.get().c_str() << std::endl;
}
           

总结

(1)备忘录模式分为回溯对象类、状态类、职责管理类每个类都具有单一职责

(2)回溯对象类负责生成瞬间的状态类对象,职责管理类负责保存这个对象

(3)职责管理类只负责保存和提供状态类,不参与其它细节;状态类只保存回溯对象的数据成员

继续阅读