重庆微信网站开发公,临潼区做网站的公司,徐州网站开发价位,百度权重4网站值多少钱1.定义 备忘录模式是一种行为型的软件设计模式#xff0c;在不破坏封装的前提下#xff0c;获取一个对象的内部状态#xff0c;并在对象外保存该状态#xff0c;当对象需要恢复到该状态时#xff0c;对其进行恢复。
2.组成结构
原发器 #xff08;Originator#xff0…1.定义 备忘录模式是一种行为型的软件设计模式在不破坏封装的前提下获取一个对象的内部状态并在对象外保存该状态当对象需要恢复到该状态时对其进行恢复。
2.组成结构
原发器 Originator 类可以生成自身状态的快照 也可以在需要时通过快照恢复自身状态。备忘录 Memento 是原发器状态快照的值对象 value object。 通常做法是将备忘录设为不可变的 并通过构造函数一次性传递数据。负责人 Caretaker 仅知道 “何时” 和 “为何” 捕捉原发器的状态 以及何时恢复状态。负责人通过保存备忘录栈来记录原发器的历史状态。 当原发器需要回溯历史状态时 负责人将从栈中获取最顶部的备忘录 并将其传递给原发器的恢复 restoration 方法。 在该实现方法中 备忘录类将被嵌套在原发器中。 这样原发器就可访问备忘录的成员变量和方法 即使这些方法被声明为私有。 另一方面 负责人对于备忘录的成员变量和方法的访问权限非常有限 它们只能在栈中保存备忘录 而不能修改其状态。
3.示例代码
//Memento.h
/****************************************************/
#pragma once
#include iostream
#include unordered_map
#include vector
#include list
#include stringusing 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::vectorMemento 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.优缺点
优点
良好封装性。发起人对象中的内部状态被保存在备忘录中也只能由自己读取对其他对象起到了屏蔽作用。提供了状态恢复机制。类似于游戏存档读档。简化了发起人职责。发起人状态的存储和获取被分离出去了。
缺点
资源消耗较大对发起人对象不同内部状态的存储会导致开销增加。
引用
设计模式之备忘录模式(C)_c 备忘录模式-CSDN博客
C 设计模式之备忘录模式 - 一杯清酒邀明月 - 博客园 (cnblogs.com)