当前位置: 首页 > news >正文

设计模式之备忘录

一、备忘录设计模式概念

备忘录模式(Memento) 是一种行为设计模式, 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。

 适用场景

  • 当你需要创建对象状态快照来恢复其之前的状态时, 可以使用备忘录模式。
  • 当直接访问对象的成员变量、 获取器或设置器将导致封装被突破时, 可以使用该模式。

备忘录设计模式的结构

  1. 原发器 (Originator) 类可以生成自身状态的快照, 也可以在需要时通过快照恢复自身状态。

  2. 备忘录 (Memento) 是原发器状态快照的值对象 (value object)。 通常做法是将备忘录设为不可变的, 并通过构造函数一次性传递数据。

  3. 负责人 (Caretaker) 仅知道 “何时” 和 “为何” 捕捉原发器的状态, 以及何时恢复状态。

    负责人通过保存备忘录栈来记录原发器的历史状态。 当原发器需要回溯历史状态时, 负责人将从栈中获取最顶部的备忘录, 并将其传递给原发器的恢复 (restoration) 方法。

  4. 在该实现方法中, 备忘录类将被嵌套在原发器中。 这样原发器就可访问备忘录的成员变量和方法, 即使这些方法被声明为私有。 另一方面, 负责人对于备忘录的成员变量和方法的访问权限非常有限: 它们只能在栈中保存备忘录, 而不能修改其状态。

代码如下:

        问题:实现一个游戏的存档功能。希望在保存状态的同时可以不破坏类的封装。
        解决方案:在不破坏封装性的前提下,捕获一个对象内部的状态,并在该对象之外保存这个状态。
        这样以后就可将该对象恢复到原先保存的状态。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <ctime>
#include <string>
//Memento
class Memento
{friend class Hero;
private:unsigned int m_state;std::string m_data;public:Memento(unsigned int state) :m_state(state) {std::time_t now = std::time(0);m_data = std::ctime(&now);}std::string getData(){return m_data;}
};//Originator
class Hero
{
private:unsigned int m_state;
public:Hero(unsigned int state):m_state(state){std::cout << "英雄:我的初始状态为:" << m_state << std::endl;}void fight(){std::cout << "英雄:战斗中..." << std::endl;m_state -= std::rand() % 20;std::cout << "英雄:战斗后状态为:" << m_state << std::endl;}Memento* save(){return new Memento(m_state);}void restore(Memento* memento){m_state = memento->m_state;std::cout << "英雄:恢复状态为:" << m_state << std::endl;}
};//Caretaker
class Caretaker
{
private:Hero* hero;std::vector<Memento*> m_mementos;
public:Caretaker(Hero* hero){this->hero = hero;}~Caretaker(){for (auto m : m_mementos){delete m;}}void backup(){std::cout << "管理者:正在保存英雄状态..."  << std::endl;m_mementos.push_back(hero->save());}void undo(){if (!m_mementos.size() > 0){return;}Memento* memento = m_mementos.back();m_mementos.pop_back();std::cout << "管理者:正在恢复英雄状态..." <<memento->getData()<< std::endl;hero->restore(memento);delete memento;}
};
int main()
{std::srand(static_cast<unsigned int>(std::time(NULL)));Hero* hero=new Hero(100);Caretaker* caretaker=new Caretaker(hero);caretaker->backup();hero->fight();hero->fight();caretaker->backup();hero->fight();caretaker->undo();delete hero;delete caretaker;
}

 二、与其他模式的关系

  • 你可以同时使用命令模式 (opens new window)和备忘录模式 (opens new window)来实现 “撤销”。 在这种情况下, 命令用于对目标对象执行各种不同的操作, 备忘录用来保存一条命令执行前该对象的状态。
  • 你可以同时使用备忘录 (opens new window)和迭代器模式 (opens new window)来获取当前迭代器的状态, 并且在需要的时候进行回滚。
  • 有时候原型模式 (opens new window)可以作为备忘录 (opens new window)的一个简化版本, 其条件是你需要在历史记录中存储的对象的状态比较简单, 不需要链接其他外部资源, 或者链接可以方便地重建。

http://www.mrgr.cn/news/35141.html

相关文章:

  • 内存泄漏与内存溢出
  • React的基础API介绍(一)
  • Java项目实战II基于Spring Boot的问卷调查系统的设计与实现(开发文档+数据库+源码)
  • hadoop开发环境搭建
  • <<零基础C++第一期, C++入门基础>>
  • MATLAB界面设计全攻略:从基础入门到高级应用
  • C++ :借助栈完成二叉树的非递归遍历
  • word怎么加密?掌握这4种加密技巧,保护你的文件安全!
  • workerman 接入文心一言的流式输出
  • PHPMailer低版本用法(实例)
  • NLP自然语言处理
  • windows使用JEnv实现一键临时或全局切换java版本
  • 一带一路区块链样题解析(上)
  • 数据结构---顺序表之单链表
  • openEuler普通用户su root时Permission denied
  • 视频生成技术分享
  • 深度学习技术在流体力学中的应用与实操培训【1/3理论课程2/3实操课程】
  • 408算法题leetcode--第14天
  • FastStone Capture屏幕长截图软件注册码
  • Paper 0 | Visual Instruction Tuning
  • 【PyCharm 安装与运用秘籍】Python 和 PyCharm 安装指引,看此篇保证学会(附带优质插件)。
  • 【秋招笔试题】多多排序
  • 基于GPU的Julia集应用程序
  • [产品管理-34]:什么是战略?什么是公司战略?什么是产品战略?什么是创新战略?什么是技术战略?什么是产品创新战略?
  • tauri开发软件中,使用tauri自带的api用浏览器打开指定的url链接
  • Spring Cloud 教程(一) | 认识Spring Cloud