c++设计模式概述之备忘录
代买写的不够规范,,目的是缩短篇幅,实际中请不要这样做。
1、概述
和这个模式相似的生活场景,比如 office的撤销操作、VS 和 xcode等IDE的撤销操作 。 其实都是恢复到上一个或者下一个状态。还有用过虚拟机的朋友, 备份虚拟机到一个状态,当目前运行出错,我们可以恢复到备份的状态。典型的【后悔药】。
模式的结构
A、发起人角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
B、备忘录角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
C、管理者角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
一个范例体验。
2、发起人角色
class originator
{
public:
void set_state(std::string str) { _str_state = str; }
std::string get_state() { return _str_state; }
// 创建备份
memento create_memento() { memento mmt(_str_state); return mmt; }
// 重置备份
void reset_memento(memento& mmmt) { _str_state = mmmt.get_memento(); }
private:
std::string _str_state;
};
3、备忘录角色
// 管理者
class care_taker
{
public:
care_taker():_memento(std::string("")) {}
void set_memento(memento mmt) { _memento = mmt; }
memento get_memento() { return _memento; }
private:
memento _memento;
};
4、管理者角色
// 管理者
class care_taker
{
public:
care_taker():_memento(std::string("")) {}
void set_memento(memento mmt) { _memento = mmt; }
memento get_memento() { return _memento; }
private:
memento _memento;
};
5、调用范例
1 void call_memento() 2 { 3 // 创建发起人和管理者 4 std::unique_ptr<originator> poriginator(new(std::nothrow) originator); 5 std::unique_ptr<care_taker> pcare_taker(new(std::nothrow) care_taker); 6 7 if (!poriginator || !pcare_taker) 8 { 9 std::cout << "\n\n管理者和发起人还没创建好"; 10 return; 11 } 12 13 // 1、初始状态 14 cout << "\n--------------------------\n初始状态:"; 15 poriginator->set_state(std::string("状态1")); 16 cout << poriginator->get_state(); 17 18 // 管理者记录变化的状态 19 pcare_taker->set_memento(poriginator->create_memento()); 20 21 // 2、更新状态 22 cout << "\n\n----------------------------\n更新状态后:"; 23 poriginator->set_state(std::string("状态2")); 24 std::cout << poriginator->get_state(); 25 26 // 管理者记录变化的状态 27 pcare_taker->set_memento(poriginator->create_memento()); 28 29 // 4、更新状态 30 cout << "\n\n----------------------------\n更新状态后:"; 31 poriginator->set_state(std::string("状态3")); 32 std::cout << poriginator->get_state(); 33 34 35 // 3、回复初始状态 36 std::cout << "\n\n---------------------------\n恢复上一个状态:"; 37 poriginator->reset_memento(pcare_taker->get_memento()); 38 std::cout << poriginator->get_state(); 39 }
6、输出结果: