代买写的不够规范,,目的是缩短篇幅,实际中请不要这样做。
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
5 std::unique_ptr
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、输出结果:
手机扫一扫
移动阅读更方便
你可能感兴趣的文章