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

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

一、备忘录模式是什么?

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

       备忘录模式的优点:

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

       程序结果如下。

扫描二维码关注公众号,回复: 15063366 查看本文章

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

三、总结

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

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

猜你喜欢

转载自blog.csdn.net/zhaitianbao/article/details/130235205
今日推荐