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

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. bitset 的妙用:乱搞字符串匹配

    最近碰到了几次 bitset 乱搞字符串匹配的情况,故写文以记之. 1. 算法简介 核心思想:假设文本串为 \(s\),则对字符集中的每一个字符 \(c\) 开一个大小为 \(|s|\) 的 bits ...

  2. Docker Hadoop 配置常见错误及解决办法

    Docker Hadoop 配置常见错误及解决办法 问题1:wordcount运行卡住,hadoop 任务运行到running job就卡住了 INFO mapreduce.Job: Running ...

  3. 【GS文献】测序时代植物复杂性状育种之基因组选择

    综述:Genomic Selection in the Era of Next Generation Sequencing for Complex Traits in Plant Breeding 要 ...

  4. R语言因子排序

    画图的时候,排序是个很重要的技巧,比如有时候会看下基因组每条染色体上的SNP的标记数量,这个时候直接做条形图是一种比较直观的方法,下面我们结合实际例子来看下: 在R环境下之际构建一个数据框,一列染色体 ...

  5. Elasticsearch中关于transform的一个问题?

    背景:现在有一个业务,派件业务,业务员今天去派件(扫描产生一条派件记录),派件可能会有重复派件的情况,第二天再派送(记录被更新,以最新的派件操作为准).现在需要分业务员按天统计每天的派件数量.es版本 ...

  6. How To Call An Ambulance

    How to Talk to the Emergency Dispatcher [minutesmatter.upmc稻糠亩] How To Call An Ambulance [askambulan ...

  7. day04 查找关键字

    day04 查找关键字 昨日内容回顾 基本数据类型之日期相关类型 date :年月日 time :时分秒 datetime:年月日时分秒 year :年 基本数据类型之枚举与集合类型 # 枚举 多选一 ...

  8. npm下载错误解决办法

    解决办法:删除npmrc文件. 使用镜像 镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在):1.通过config命令12npm config set re ...

  9. Web安全学习二

    目录 常见漏洞攻防 SQL注入 注入分类 按技巧分类 按获取数据的方式分类 注入检测 权限提升 数据库检测 绕过技巧 CheatSheet SQL Server Payload MySQL Paylo ...

  10. fastjson转换数字时,格式化小数点

    使用fastjson类库转换java对象时,对于BigDecimal类型,有时需要特殊格式,比如: 1.0,转为json时候,要求显式为1,因此需要在转换时做处理.步骤如下: 1.新建类,实现Valu ...