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 - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 实现不了是研发的借口? 实现不了,有时候是功能复杂度较高难以实 ...
随机推荐
- expr计算字符串长度
命令:expr length "quanzhiqinag" #!/bin/bash for N in quan zhi qiang do if [ `expr length $N ...
- android listview展示图片
最近学习android开发,感触颇多,和网站开发对比,还是有很大的差距,在这里记录一下. android listview展示图片 在网站开发上,展示图片非常简单,一个HTML img标签就搞定,加上 ...
- karatsuba乘法
karatsuba乘法 Karatsuba乘法是一种快速乘法.此算法在1960年由Anatolii Alexeevitch Karatsuba 提出,并于1962年得以发表.[1] 此算法主要用于两个 ...
- Demo04分解质因数
package 习题集1;import java.util.Scanner;//将一个正整数分解质因数.例如输入90,打印出90=2*3*3*5public class Demo04 { public ...
- tensorboard No dashboards are active for the current data set.
修改一下启动命令时的路径 位置示例: 命令为 E:\PYTHON_PROJECT\testTF\inceptionV1_net\log>tensorboard --logdir=TEC4FN ...
- 如何设置eclipse下查看java源码
windows--preferences--java--installed jres --选中jre6--点击右边的edit--选中jre6/lib/rt.jar --点击右边的 source att ...
- 3.3 GO字符串处理
strings方法 index 判断子字符串或字符在父字符串中出现的位置(索引)Index 返回字符串 str 在字符串 s 中的索引( str 的第一个字符的索引),-1 表示字符串 s 不包含字符 ...
- 第7章 使用性能利器——Redis
在现今互联网应用中,NoSQL已经广为应用,在互联网中起到加速系统的作用.有两种NoSQL使用最为广泛,那就是Redis和MongoDB.本章将介绍Redis和Spring Boot的结合.Redis ...
- SpringMVC中@RestController和@Controller的区别
在使用SpringMVC时,对于Controller中的注解@RestController和@Controller需要我们区分清楚 @RestController注解相当于@ResponseBody和 ...
- Spring Boot对静态资源的映射规则
规则一:所有 " /webjars/** " 请求都去classpath:/META-INF/resources/webjars/找资源 webjars:以jar包的方式引入静态资 ...