c++ 行为型_备忘录模式(Memento)
2024-10-06 17:00:37
行为型_备忘录模式(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"); }
最新文章
- Android微信分享图片大于32k进行压缩
- 从头安装及配置PL/SQL Developer
- Linux bash运维操作日志审计(单服务器)
- [状压dp]POJ1185 炮兵阵地
- (转载)使用JavaScript操作表单
- python学习笔记--Django入门三 Django 与数据库的交互:数据建模
- Unity3D 获得GameObject组件的方法
- 【剑指offer】面试题31:连续子数组的最大和
- PHP - 接口 - 多接口
- 如何安装ArchLinux
- Android&#160;stdio打开特定网页
- 以太坊工作原理之txpool详解
- SQL反模式学习笔记20 明文密码
- c++中的左值与右值
- uva11300 分金币(中位数)
- Django --ORM常用的字段和参数 多对多创建形式
- (转)Spring Cloud(一)
- android-sdk和api版本
- js把mysql传过来的时间格式化为:0000-00-00 00:00:00
- oracle锁---原理篇
热门文章
- tap 事件会触发两次问题
- 查找、AVL树、散列表
- python if else elif statement
- 错误/异常:org.springframework.beans.factory.BeanCreationException: Error creating bean with name &#39;sessionFactory&#39; defined in ServletContext resource [/WEB-INF/classes/beans_common.xml]...的解决方法
- Jmeter随机参数各种搭配
- CISCO实验记录七:OSPF
- Linux设备驱动程序 之 后备高速缓存
- Flutter移动电商实战 --(36)FlutterToast插件使用
- concurrency parallel 并发 并行 parallelism
- MySQL 临时表和复制表