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

c++设计模式概述之备忘录的更多相关文章
- OOAD-设计模式(二)之GRASP模式与GOF设计模式概述
一.GRASP模式(通用责任分配软件模式)概述 1.1.理解责任 1)什么是责任 责任是类间的一种合约或义务,也可以理解成一个业务功能,包括行为.数据.对象的创建等 知道责任——表示知道什么 行为责任 ...
- PHP设计模式概述
PHP设计模式概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...
- java设计模式概述
java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模 ...
- Java设计模式学习记录-备忘录模式
前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...
- 23种GoF设计模式概述
23种GoF设计模式概述 在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解.后面的章节再进行详细介绍. 创建型模式 关注于怎么创建对象的 ...
- Java设计模式(一):设计模式概述、UML图、设计原则
1 设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
- 设计模式(一)----设计模式概述及UML图解析
1.设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
- java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述
在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...
- 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 实现不了是研发的借口? 实现不了,有时候是功能复杂度较高难以实 ...
随机推荐
- Educational Codeforces Round 89 题解
昨晚简单 vp 了场比赛找了找状态,切了 5 个题(有一个差点调出来),rk57,还算理想吧,毕竟我已经好久没碰过电脑了( A 签到题不多说,直接输出 \(\min\{a,b,\dfrac{a+b}{ ...
- [linux] 常用命令及参数-2
sort 1 sort是把结果输出到标准输出,因此需要输出重定向将结果写入文件 2 sort seq.txt > file.txt 3 sort -u seq.txt 输出去重重复后的行 4 s ...
- Windows下的Python多版本管理?
虽然接触了好几年python,但一些细节没有注意.最近看网课,看到这个Windows系统下Python多版本管理的问题,记录下备忘. 假设现在windows环境中有python2,python3和an ...
- 8.Maximum Depth of Binary Tree
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...
- 简单的Mybatis程序
1.新建一个普通Maven项目,导入 mybatis.mysql.junit(用于测试)3个依赖 Mybatis <dependency> <groupId>org.mybat ...
- 日常Java 2021/10/26
HashSet基于HashMap来实现的,是一个不允许有重复元素的集合.HashSet 允许有null 值. HashSet是无序的,即不会记录插入的顺序. HashSet不是线程安全的,如果多个线程 ...
- Android项目的settings.gradle和build.gradle
gradle构建的项目中的build.gradle和settings.gradle文件 build.gradle 浅析(一) 史上最全的Android build.gradle配置教程 Android ...
- Insert into select语句引发的生产事故
前言 Insert into select请慎用.这天xxx接到一个需求,需要将表A的数据迁移到表B中去做一个备份.本想通过程序先查询查出来然后批量插入.但xxx觉得这样有点慢,需要耗费大量的网络 ...
- Linux:-e、-d、-f、-L、-r、-w、-x、-s、-h、
-e filename 如果 filename存在,则为真 -d filename 如果 filename为目录,则为真 -f filename 如果 filename为常规文件,则为真 -L fil ...
- Spring 的 init-method 和 destory-method
关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种 第一种注解: 通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 ...