代买写的不够规范,,目的是缩短篇幅,实际中请不要这样做。

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++设计模式概述之备忘录的更多相关文章

  1. OOAD-设计模式(二)之GRASP模式与GOF设计模式概述

    一.GRASP模式(通用责任分配软件模式)概述 1.1.理解责任 1)什么是责任 责任是类间的一种合约或义务,也可以理解成一个业务功能,包括行为.数据.对象的创建等 知道责任——表示知道什么 行为责任 ...

  2. PHP设计模式概述

    PHP设计模式概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...

  3. java设计模式概述

    java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模 ...

  4. Java设计模式学习记录-备忘录模式

    前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...

  5. 23种GoF设计模式概述

    23种GoF设计模式概述 在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解.后面的章节再进行详细介绍. 创建型模式 关注于怎么创建对象的 ...

  6. Java设计模式(一):设计模式概述、UML图、设计原则

    1 设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...

  7. 设计模式(一)----设计模式概述及UML图解析

    1.设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...

  8. java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述

    在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...

  9. 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 实现不了是研发的借口? 实现不了,有时候是功能复杂度较高难以实 ...

随机推荐

  1. 【豆科基因组】利马豆/洋扁豆Lima bean(Phaseolus lunatus L.)基因组2021NC

    目录 一.来源 二.结果 扁豆的染色体水平高质量组装 扁豆相关农艺性状的QTL定位 直系/旁系同源的演化和物种形成事件 与农艺性状相关基因的直系同源物 群体结构分析揭示扁豆遗传簇 豆荚发育过程中的基因 ...

  2. 如何根据fasta快速统计基因组大小及其各染色体长度?

    基因组长度 利用seqkit统计长度 seqkit stat test.fa 结果如下: file format type num_seqs sum_len min_len avg_len max_l ...

  3. GWAS分析结果中pvalue/p.ajust为0时如何处理?

    在GWAS分析的结果中,偶尔会遇到到pvalue为0的SNP位点,这时如果直接做曼哈顿或QQ图,会出错,因为log0无意义. 此时,该如何处理? 如果你用的是Plink1.9来做的GWAS,可加一个参 ...

  4. Oracle-trunc函数、round 函数、ceil函数和floor函数---处理数字函数使用

    0.round函数 按照指定小数位数进行四舍五入运算. SELECT ROUND( number, [ decimal_places ] ) FROM DUAL #number : 待处理数值  de ...

  5. 电脑盘符为什么从C盘开始?A盘和B盘去哪了?

    虽然我们几乎每天都在跟电脑打交道,但是不知道大家有没有过疑惑,为什么电脑盘符是从C盘开始命名呢?有没有A盘和B盘??A盘和B盘去哪了??? 其实,A盘和B盘是真实存在的. 在早期的DOS时代,计算机的 ...

  6. C语言中的main函数的参数解析

    main()函数既可以是无参函数,也可以是有参的函数.对于有参的形式来说,就需要向其传递参数.但是其它任何函数均不能调用main()函数.当然也同样无法向main()函数传递,只能由程序之外传递而来. ...

  7. Learning Spark中文版--第五章--加载保存数据(1)

      开发工程师和数据科学家都会受益于本章的部分内容.工程师可能希望探索更多的输出格式,看看有没有一些适合他们下游用户的格式.数据科学家可能会更关注他们已经使用的数据格式. Motivation   我 ...

  8. Kotlin 学习(1)

    本文出自链接:https://www.jianshu.com/p/ef9584a8ebf8 Kotlin的插件安装: Settings->Plugins->Browse Repositor ...

  9. 3.7 rust 静态块

    Cargo.toml [dependencies] lazy_static = "1.4.0" main.rs #[macro_use] extern crate lazy_sta ...

  10. HDC2021技术分论坛:进程崩溃/应用卡死,故障频频怎么办?

    ​作者:jiwenqiang,DFX技术专家 提到开发一个产品,我们通常首先想到的是要实现什么样的功能,但是除了功能之外,非功能属性也会很大程度上影响一个产品的体验效果,比如不定时出现的应用卡死.崩溃 ...