备忘录模式 行为型模式之八

1.定义

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

2.组成结构

  1. 原发器 (Originator) 类可以生成自身状态的快照, 也可以在需要时通过快照恢复自身状态。
  2. 备忘录 (Memento) 是原发器状态快照的值对象 (value object)。 通常做法是将备忘录设为不可变的, 并通过构造函数一次性传递数据。
  3. 负责人 (Caretaker) 仅知道 "何时" 和 "为何" 捕捉原发器的状态, 以及何时恢复状态。负责人通过保存备忘录栈来记录原发器的历史状态。 当原发器需要回溯历史状态时, 负责人将从栈中获取最顶部的备忘录, 并将其传递给原发器的恢复 (restoration) 方法。

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

3.示例代码

cpp 复制代码
//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;
};

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;
}

4.优缺点

优点:

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

缺点:

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

引用

设计模式之备忘录模式(C++)_c++ 备忘录模式-CSDN博客

C++ 设计模式之备忘录模式 - 一杯清酒邀明月 - 博客园 (cnblogs.com)

相关推荐
闻缺陷则喜何志丹4 分钟前
【数论 快速指数幂 龟速乘】P8652 [蓝桥杯 2017 国 C] 小数第 n 位|普及+
c++·蓝桥杯·数论·快速指数幂·龟速乘
༾冬瓜大侠༿4 分钟前
C++string
c语言·开发语言·c++·算法
-dzk-8 小时前
【代码随想录】LC 59.螺旋矩阵 II
c++·线性代数·算法·矩阵·模拟
m0_706653239 小时前
C++编译期数组操作
开发语言·c++·算法
qq_4232339010 小时前
C++与Python混合编程实战
开发语言·c++·算法
m0_7155753410 小时前
分布式任务调度系统
开发语言·c++·算法
CSDN_RTKLIB10 小时前
简化版unique_ptr说明其本质
c++
naruto_lnq10 小时前
泛型编程与STL设计思想
开发语言·c++·算法
m0_7487080511 小时前
C++中的观察者模式实战
开发语言·c++·算法
时光找茬11 小时前
【瑞萨AI挑战赛-FPB-RA6E2】+ 从零开始:FPB-RA6E2 开箱测评与 e2 studio 环境配置
c++·单片机·边缘计算