文章目录

  • 备忘录(Memento)模式定义
  • 备忘录(Memento)模式优缺点
    • 优点
    • 缺点
  • 备忘录(Memento)模式构成与实现
    • 构成
    • 实例

备忘录(Memento)模式定义

备忘录(Memento): 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态

备忘录(Memento)模式优缺点

优点

  • 你可以在不破坏对象封装情况的前提下创建对象状态快照。
  • 你可以通过让负责人维护原发器状态历史记录来简化原发器代码

缺点

  • 如果客户端过于频繁地创建备忘录,程序将消耗大量内存。
  • 负责人必须完整跟踪原发器的生命周期,这样才能销毁弃用的备忘录。
  • 绝大部分动态编程语言(例如 PHP、 Python 和 JavaScript)不能确保备忘录中的状态不被修改。

备忘录(Memento)模式构成与实现

构成

  • 原发器(Originator)类可以生成自身状态的快照,也可以在需要时通过快照恢复自身状态。
  • 备忘录 (Memento) 是原发器状态快照的值对象 (valueobject)。通常做法是将备忘录设为不可变的,并通过构造函数一次性传递数据。
  • 负责人(Caretaker)仅知道“何时”和“为何”捕捉原发器的状态,以及何时恢复状态。负责人通过保存备忘录栈来记录原发器的历史状态。当原发器需要回溯历史状态时,负责人将从栈中获取最顶部的备忘录,并将其传递给原发器的恢复(restoration)方法。
  • 在该实现方法中,备忘录类将被嵌套在原发器中。这样原发器就可访问备忘录的成员变量和方法,即使这些方法被声明为私有。另一方面,负责人对于备忘录的成员变量和方法的访问权限非常有限:它们只能在栈中保存备忘录,而不能修改其状态。

实例

Memento.h:

#ifndef MEMENTO_H_
#define MEMENTO_H_#include <string>// 备忘录类保存编辑器的过往状态
class Snapshot {public:Snapshot(std::string text, int x, int y, double width): text_(text), cur_x_(x), cur_y_(y), selection_width_(width) {}std::string get_text() {return text_;}int get_cur_x() {return cur_x_;}int get_cur_y() {return cur_y_;}double get_selection_width() {return selection_width_;}private:const std::string text_;const int cur_x_;const int cur_y_;const double selection_width_;
};#endif  // MEMENTO_H_

Originator.h:

#ifndef ORIGINATOR_H_
#define ORIGINATOR_H_#include <cstdio>
#include <string>
#include <memory>
#include "Memento.h"// 原发器中包含了一些可能会随时间变化的重要数据
// 它还定义了在备忘录中保存自身状态的方法, 以及从备忘录中恢复状态的方法
class Editor {public:void setText(std::string text) {text_ = text;}void setCursor(int x, int y) {cur_x_ = x;cur_y_ = y;}void setSelectionWidth(double width) {selection_width_ = width;}// 在备忘录中保存当前的状态std::shared_ptr<Snapshot> createSnapshot() {// 备忘录是不可变的对象, 因此原发器会将自身状态作为参数传递给备忘录的构造函数auto res = std::make_shared<Snapshot>(text_, cur_x_, cur_y_, selection_width_);printf("创建编辑器快照成功, text:%s x:%d y:%d width:%.2f\n", text_.c_str(), cur_x_, cur_y_, selection_width_);return res;}void resotre(std::shared_ptr<Snapshot> sptr_snapshot) {text_ = sptr_snapshot->get_text();cur_x_ = sptr_snapshot->get_cur_x();cur_y_ = sptr_snapshot->get_cur_y();selection_width_ = sptr_snapshot->get_selection_width();printf("恢复编辑器状态成功, text:%s x:%d y:%d width:%.2f\n", text_.c_str(), cur_x_, cur_y_, selection_width_);}private:// 文本std::string text_;// 光标位置int cur_x_;int cur_y_;// 当前滚动条位置double selection_width_;
};#endif  // ORIGINATOR_H_

Caretaker.h:

#ifndef CARETAKER_H_
#define CARETAKER_H_#include <memory>
#include "Memento.h"
#include "Originator.h"class Command {public:explicit Command(Editor* e) : editor_(e) {}void makeBackup() {backup_ = editor_->createSnapshot();}void undo() {if (backup_) {editor_->resotre(backup_);}}private:Editor *editor_;std::shared_ptr<Snapshot> backup_;
};#endif  // CARETAKER_H_

main.cpp

#include "Caretaker.h"int main() {system("chcp 65001");// 创建原发器和负责人Editor editor;Command command(&editor);// 定义初始状态editor.setText("TOMOCAT");editor.setCursor(21, 34);editor.setSelectionWidth(3.4);// 保存状态command.makeBackup();// 更改编辑器状态editor.setText("KKKK");editor.setCursor(111, 222);editor.setSelectionWidth(111.222);// 撤销command.undo();system("pause");return 0;
}

输出:

Active code page: 65001
创建编辑器快照成功, text:TOMOCAT x:21 y:34 width:3.40
恢复编辑器状态成功, text:TOMOCAT x:21 y:34 width:3.40
Press any key to continue . . .

22 C++设计模式之备忘录(Memento)模式相关推荐

  1. 设计模式学习笔记——备忘录(Memento)模式

    设计模式学习笔记--备忘录(Memento)模式 @(设计模式)[设计模式, 备忘录模式, memento] 设计模式学习笔记备忘录Memento模式 基本介绍 备忘录案例 类图 实现代码 Memen ...

  2. java memento_Java备忘录(Memento)模式实现的示例代码

    Java备忘录(Memento)模式实现的示例代码 /** * 数据对象 * @author stone * */ public class DataState { private String ac ...

  3. 用Java做手机备忘录_Java 实现备忘录(Memento)模式

    /** * 数据对象 * @author stone * */ public class DataState { private String action; public void setActio ...

  4. 设计模式--备忘录(Memento)模式

    模式定义 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态 类图 要点总结 备忘录(Memento)存储原发器(Originato ...

  5. Java设计模式之从[暗黑破坏神存档点]分析备忘录(Memento)模式

    在大部分游戏中,都有一个"存档点"的概念.比如,在挑战boss前,游戏会在某个地方存档,假设玩家挑战boss失败,则会从这个存档点開始又一次游戏.因此,我们能够将这个"存 ...

  6. memento模式_Java中的Memento设计模式

    memento模式 Memento design pattern is one of the behavioral design pattern. Memento design pattern is ...

  7. memento模式_Java中的Memento设计模式-示例教程

    memento模式 记忆模式是行为设计模式之一 . 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式. 使用Memento模式以这种方式实现该目的,即无法在对象外部访问对象的已 ...

  8. java备忘录模式 类图,【java设计模式】备忘录模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述备忘录(Memento)模式的: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. 备忘录 ...

  9. 设计模式:备忘录模式(Memento)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

最新文章

  1. 凯文·凯利:未来很美好,今天仍是Day1
  2. Swift 扩展存储属性
  3. Head First设计模式之原型模式
  4. 11- 深度学习之神经网络核心原理与算法-卷积核典型的CNN网络
  5. java疯狂讲义内存分配_java疯狂讲义学习:面向对象(上)
  6. pandas读写各种类型数据
  7. 中国医学不能走西方道路
  8. ZAO回应被约谈...
  9. 在Cisco ASA 5510 上配置ssh登录
  10. 2022年寒假ACM练习1
  11. html5的file api,HTML5 File API
  12. mysql 事务 实现_什么是mysql的事务和实现
  13. 遗传算法Python代码实现
  14. VirtualXposed 免ROOT使用Xposed模块
  15. arcgis android离线地图,Arcgis Android API开发之离线地图
  16. 泊松过程1 | 定义与基本性质
  17. tpc-c 服务器性能,TPC-E和TPC-C测试结果比较之我见
  18. Navicat远程连接Oracle数据库
  19. Unity跑酷游戏的无尽关卡是如何生成的?
  20. 【解决方案】RTSP/Onvif安防视频直播解决方案EasyNVR在某省高速上云项目中的应用分析

热门文章

  1. Mac 下 Chrome 快捷键大全
  2. 51单片机红外通信及控制LED灯(LCD1602显示)
  3. 旭宇同创:拼多多怎么店铺定位?
  4. WPF调色盘(2):显示调色盘
  5. C语言实现扫雷(具体步骤和代码)
  6. 常见Linux、ROS命令
  7. C语言 简单选择排序法
  8. 日全食--21世纪最大规模的日全食
  9. java输出流_缓存_复制文件
  10. Word 按章节生成图表目录