设计模式之备忘录模式(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;
}

    程序结果如下。

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

三、总结

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

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

相关文章
|
7月前
|
设计模式 存储 Java
23种设计模式,备忘录模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】备忘录模式是一种行为设计模式,它能在不破坏对象封装的前提下,捕获并保存对象的当前状态,以便后面可以恢复到这个状态。
87 0
|
3月前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
4月前
|
设计模式 算法
设计模式的基础问题之备忘录模式在软件开发的问题如何解决
设计模式的基础问题之备忘录模式在软件开发的问题如何解决
|
5月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
47 3
|
5月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
65 2
|
6月前
|
设计模式
备忘录模式-大话设计模式
备忘录模式-大话设计模式
|
5月前
|
设计模式 数据处理
iLogtail设计模式问题之什么是备忘录模式
iLogtail设计模式问题之什么是备忘录模式
|
7月前
|
设计模式 开发框架 算法
C++中的设计模式:基本概念与应用
C++中的设计模式:基本概念与应用
72 2
|
6月前
|
设计模式 存储 Java
Java设计模式之备忘录模式详解
Java设计模式之备忘录模式详解
|
7月前
|
存储 设计模式 安全
探索设计模式的魅力:备忘录模式揭秘-实现时光回溯、一键还原、后悔药、历史的守护者和穿越时空隧道
备忘录模式是一种行为设计模式,允许在不破坏对象封装性的情况下保存和恢复对象的内部状态。该模式通过创建备忘录对象来存储发起人的状态信息,发起人可根据需要创建和恢复备忘录。管理者则负责保存和管理备忘录,但无法访问其内容。备忘录模式简化了状态管理,支持撤销操作和历史记录功能,提高了系统的灵活性和可用性。在实际应用中,备忘录模式常用于文本编辑器、游戏和数据库事务处理等场景,确保对象状态的安全恢复和有效管理。通过备忘录模式,开发人员可以更好地控制对象状态的变化,提升软件系统的健壮性和用户体验。
154 1
探索设计模式的魅力:备忘录模式揭秘-实现时光回溯、一键还原、后悔药、历史的守护者和穿越时空隧道

热门文章

最新文章

  • 1
    设计模式转型:从传统同步到Python协程异步编程的实践与思考
    59
  • 2
    C++一分钟之-设计模式:工厂模式与抽象工厂
    47
  • 3
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    54
  • 4
    C++一分钟之-C++中的设计模式:单例模式
    65
  • 5
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    43
  • 6
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    70
  • 7
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    62
  • 8
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    43
  • 9
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    52
  • 10
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    121