可以用友元来实现对私有成员的访问
备忘录模式
定义:
不破坏封装前提下捕获一个对象的内部状态,并在对象之外保存,从而使对象能在以后恢复到该状态
优点:
(1)实现一种恢复机制,对象可回溯到先前状态
(2)可采用集合方式实现多次回溯操作
缺点:
(1)资源消耗过大,有众多的临时对象需要分配和跟踪
使用范围:
需要保存一个对象全部或者部分状态,且会触发回撤情况
如: 文档编辑器的回退crtl+z
结构:
rpg:需回溯对象类
status:状态类,保存可回溯对象一瞬间内部状态
memento_pattern:状态管理类,保存和提供状态对象
实现:
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)职责管理类只负责保存和提供状态类,不参与其它细节;状态类只保存回溯对象的数据成员