行为型_备忘录模式(Memento)

作用场景:

当意图在对象外面保存对象的内部状态,但是又不想破坏对象的封装性,就可以考虑备忘录模式。

解释:

其参与者包括

1、Memnto(备忘录,如下列CountMemento )

2、Originator(原发器,如下列Counter ),

3、Caretaker(管理者,如下列CounterCaretaker )

Memnto用于保存Originator内部状态,其私有窄接口只能有Originator访问,Caretaker只能访问Memnto的宽接口。所以通常Memnto和Originator是友元。

例如;

一个计数器,有个初始状态值,可以操作计数增加,后来我们想这个计数器或者另一个计数器也恢复成这个初始值。我们用备忘录模式解决这个问题

类:

Counter  计数器

CountMemento 计数器备忘录

CounterCaretaker 操作者

类图:

代码:

  

 #include <iostream>
 class CountMemento
 {
 public:
     CountMemento(int count) :m_count(count) {}
     ~CountMemento() {};
 private:
     friend class Counter;
     int getCount()
     {
         return m_count;
     }
     int m_count;
 };
 class Counter
 {
 public:
     Counter(int count) :m_count(count) {}
     ~Counter() {}
     CountMemento* saveState()
     {
         return new CountMemento(m_count);
     }
     void recoverState(CountMemento* p_countMemento)
     {
         m_count = p_countMemento->getCount();
     }
     void increase() { m_count++; }
     void show() { printf("count :%d\n", m_count); }
 private:
     int m_count;
 };

 class CounterCaretaker
 {
 public:
     void setCountMemento(CountMemento* p_countMemento)
     {
         m_countMemento = p_countMemento;
     }
     CountMemento* getCountMemento()
     {
         return m_countMemento;
     }
 private:
     CountMemento* m_countMemento;
 };

 int main()
 {
     CounterCaretaker counterCaretaker;
     Counter counter();
     counter.show();
     printf("save counter...\n");
     counterCaretaker.setCountMemento(counter.saveState());
     printf("start incresing...\n");
     ; i < ; ++i)
     {
         counter.increase();
     }
     printf("after incresing...\n");
     counter.show();
     printf("recovering...\n");
     counter.recoverState(counterCaretaker.getCountMemento());
     counter.show();
     system("pause");
 }

最新文章

  1. Android微信分享图片大于32k进行压缩
  2. 从头安装及配置PL/SQL Developer
  3. Linux bash运维操作日志审计(单服务器)
  4. [状压dp]POJ1185 炮兵阵地
  5. (转载)使用JavaScript操作表单
  6. python学习笔记--Django入门三 Django 与数据库的交互:数据建模
  7. Unity3D 获得GameObject组件的方法
  8. 【剑指offer】面试题31:连续子数组的最大和
  9. PHP - 接口 - 多接口
  10. 如何安装ArchLinux
  11. Android&#160;stdio打开特定网页
  12. 以太坊工作原理之txpool详解
  13. SQL反模式学习笔记20 明文密码
  14. c++中的左值与右值
  15. uva11300 分金币(中位数)
  16. Django --ORM常用的字段和参数 多对多创建形式
  17. (转)Spring Cloud(一)
  18. android-sdk和api版本
  19. js把mysql传过来的时间格式化为:0000-00-00 00:00:00
  20. oracle锁---原理篇

热门文章

  1. tap 事件会触发两次问题
  2. 查找、AVL树、散列表
  3. python if else elif statement
  4. 错误/异常:org.springframework.beans.factory.BeanCreationException: Error creating bean with name &#39;sessionFactory&#39; defined in ServletContext resource [/WEB-INF/classes/beans_common.xml]...的解决方法
  5. Jmeter随机参数各种搭配
  6. CISCO实验记录七:OSPF
  7. Linux设备驱动程序 之 后备高速缓存
  8. Flutter移动电商实战 --(36)FlutterToast插件使用
  9. concurrency parallel 并发 并行 parallelism
  10. MySQL 临时表和复制表