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、输出结果:

 

posted @ 2020-08-15 00:06  mohist  阅读(145)  评论(0编辑  收藏  举报