备忘录模式是一种行为型的软件设计模式,在不破坏封装的前提下,获取一个对象的内部状态,并在对象外保存该状态,当对象需要恢复到该状态时,对其进行恢复。
在该实现方法中, 备忘录类将被嵌套在原发器中。 这样原发器就可访问备忘录的成员变量和方法, 即使这些方法被声明为私有。 另一方面, 负责人对于备忘录的成员变量和方法的访问权限非常有限: 它们只能在栈中保存备忘录, 而不能修改其状态。
- //Memento.h
- /****************************************************/
- #pragma once
- #include
- #include
- #include
- #include
- #include
-
- 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
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;
- }
优点:
缺点:
资源消耗较大,对发起人对象不同内部状态的存储,会导致开销增加。
设计模式之备忘录模式(C++)_c++ 备忘录模式-CSDN博客
C++ 设计模式之备忘录模式 - 一杯清酒邀明月 - 博客园 (cnblogs.com)