c++设计模式概述之备忘录
阅读原文时间:2023年07月09日阅读:2

代买写的不够规范,,目的是缩短篇幅,实际中请不要这样做。

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 poriginator(new(std::nothrow) originator);
5 std::unique_ptr 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、输出结果:

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章