设计模式之备忘录模式(C++)

简介: 设计模式之备忘录模式(C++)

一、备忘录模式是什么?

      备忘录模式是一种行为型的软件设计模式,在不破坏封装的前提下,获取一个对象的内部状态,并在对象外保存该状态,当对象需要恢复到该状态时,对其进行恢复。


      备忘录模式的优点:


  1. 良好封装性。发起人对象中的内部状态被保存在备忘录中,也只能由自己读取,对其他对象起到了屏蔽作用。
  2. 提供了状态恢复机制。类似于游戏存档读档。
  3. 简化了发起人职责。发起人状态的存储和获取,被分离出去了。

     备忘录模式的缺点:


  1. 资源消耗较大,对发起人对象不同内部状态的存储,会导致开销增加。

二、备忘录模式

2.1 结构图

      客户端即Main主函数,游戏的进度放在备忘录中,由备忘录管理类管理。

2.2 代码示例

      场景描述:玩游戏通关后保存进度,后面还可以加载重玩。

//Memento.h
/****************************************************/
#pragma once
#include <iostream>
#include <unordered_map>
#include <vector>
#include <list>
#include <string>
using namespace std;
// 备忘录类-游戏进度
class Memento 
{
public:
  // 构造函数
  Memento(string state) : m_state(state) {}
  // 获取状态
  std::string getState() const{ 
    return m_state;
  }
private:
  std::string m_state;
};
// 发起类-游戏
class Game 
{
public:
  // 设置状态
  void setState(string state) { 
    m_state = state;
  }
  // 获取状态
  string getState() { 
    return m_state;
  }
  // 保存状态至备忘录
  Memento saveStateToMemento() { 
    return Memento(m_state); 
  }
  // 从备忘录获取状态
  void getStateFromMemento(const Memento& memento) { 
    m_state = memento.getState(); 
  }
private:
  std::string m_state;
};
// 备忘录管理类-进度管理
class CareTaker 
{
public:
  // 添加备忘录
  void addMemento(const Memento& memento) { 
    m_mementos.push_back(memento);
  }
  // 获取备忘录
  Memento getMemento(int index) { 
    return m_mementos[index];
  }
private:
  std::vector<Memento> m_mementos;
};
//main.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Memento.h"
using namespace std;
int main() 
{
  Game game;
  CareTaker careTaker;
  // 通关
  game.setState("进度:第一关通过");
  game.setState("进度:第二关通过");
  // 保存进度,进度被管理系统管理
  careTaker.addMemento(game.saveStateToMemento());
  // 继续通关
  game.setState("进度:第三关通过");
  // 保存进度,进度被管理系统管理
  careTaker.addMemento(game.saveStateToMemento());
  // 继续通关
  game.setState("进度:第四关通过");
  // 当前进度
  cout << "当前" << game.getState() << endl;
  // 获取首个进度
  game.getStateFromMemento(careTaker.getMemento(0));
  cout << "1)" << game.getState() << endl;
  // 获取第二个进度
  game.getStateFromMemento(careTaker.getMemento(1));
  cout << "2)" << game.getState() << endl;
  return 0;
}

    程序结果如下。

      游戏通过第二关后保存进度,这是进度一;通过第三关后又一次保存进度,这是进度二;通过第四关后想要重玩进度一,就加载了进度一,此时进度变为刚通过第二关的状态;加载进度二,也是一样。

三、总结

      我尽可能用较通俗的话语和直观的代码例程,来表述我对备忘录模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解备忘录模式。

      如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关文章
|
2月前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
65 0
|
2月前
|
设计模式 算法 C++
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程(二)
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程
30 0
|
2月前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
30 1
|
2月前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
54 0
|
17天前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
18天前
|
设计模式 存储
【设计模式系列笔记】备忘录模式
备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不暴露对象实现细节的情况下捕获并恢复其内部状态。这种模式属于行为型设计模式。备忘录模式通常包含以下几个角色:发起人,备忘录,管理者。
21 0
|
25天前
|
存储 设计模式 安全
探索设计模式的魅力:备忘录模式揭秘-实现时光回溯、一键还原、后悔药、历史的守护者和穿越时空隧道
备忘录模式是一种行为设计模式,允许在不破坏对象封装性的情况下保存和恢复对象的内部状态。该模式通过创建备忘录对象来存储发起人的状态信息,发起人可根据需要创建和恢复备忘录。管理者则负责保存和管理备忘录,但无法访问其内容。备忘录模式简化了状态管理,支持撤销操作和历史记录功能,提高了系统的灵活性和可用性。在实际应用中,备忘录模式常用于文本编辑器、游戏和数据库事务处理等场景,确保对象状态的安全恢复和有效管理。通过备忘录模式,开发人员可以更好地控制对象状态的变化,提升软件系统的健壮性和用户体验。
30 1
探索设计模式的魅力:备忘录模式揭秘-实现时光回溯、一键还原、后悔药、历史的守护者和穿越时空隧道
|
2月前
|
设计模式 算法 中间件
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
126 1
|
2月前
|
设计模式 机器学习/深度学习 算法
C++设计模式新篇章:掌握状态委托
C++设计模式新篇章:掌握状态委托
75 0
|
2月前
|
设计模式 算法 C++
从 C++ 优化状态机实现:结合设计模式的实用指南
从 C++ 优化状态机实现:结合设计模式的实用指南
69 1