一、备忘录模式是什么?
备忘录模式是一种行为型的软件设计模式,在不破坏封装的前提下,获取一个对象的内部状态,并在对象外保存该状态,当对象需要恢复到该状态时,对其进行恢复。
备忘录模式的优点:
- 良好封装性。发起人对象中的内部状态被保存在备忘录中,也只能由自己读取,对其他对象起到了屏蔽作用。
- 提供了状态恢复机制。类似于游戏存档读档。
- 简化了发起人职责。发起人状态的存储和获取,被分离出去了。
备忘录模式的缺点:
- 资源消耗较大,对发起人对象不同内部状态的存储,会导致开销增加。
二、备忘录模式
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; }
程序结果如下。
游戏通过第二关后保存进度,这是进度一;通过第三关后又一次保存进度,这是进度二;通过第四关后想要重玩进度一,就加载了进度一,此时进度变为刚通过第二关的状态;加载进度二,也是一样。
三、总结
我尽可能用较通俗的话语和直观的代码例程,来表述我对备忘录模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解备忘录模式。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!