设计模式---备忘录模式

91 阅读2分钟

定义

备忘录模式(Memento Pattern)是一种行为型设计模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。

结构

  • 备忘录(Memento)

    • 负责存储发起人的内部状态。在不破坏封装性的前提下,备忘录对象会存储发起人的内部状态。备忘录只允许发起人访问其状态。
    • 备忘录通常包含保存状态所需的私有成员变量,并提供访问这些变量的友元函数或者其他受限访问的机制。
  • 发起人(Originator)

    • 创建一个包含其当前内部状态的备忘录对象,并能根据备忘录对象恢复其内部状态。
    • 发起人可以访问其内部状态,并提供创建备忘录和恢复状态的方法。
    • 发起人将自身的内部状态保存到备忘录对象中,并能够从备忘录对象中恢复之前的状态。
  • 管理者(Caretaker)

    • 负责保存好备忘录,但不能对备忘录的内容进行操作或检查。
    • 管理者持有对备忘录对象的引用,但不对备忘录对象的内容进行操作,只负责备忘录的存储和管理。

代码示例

通过角色状态管理者保存和恢复游戏角色的状态。

#include <iostream>


// 角色状态存储类
class RoleStateMemento
{
private:
	int vitality;
	int attack;
	int defense;

public:
	RoleStateMemento()
	{

	}

	RoleStateMemento(int vitality, int attack, int defense)
		: vitality(vitality), attack(attack), defense(defense) {}

	int getVitality() const
	{
		return vitality;
	}

	void setVitality(int val)
	{
		vitality = val;
	}

	int getAttack() const
	{
		return attack;
	}

	void setAttack(int val)
	{
		attack = val;
	}

	int getDefense() const 
	{
		return defense;
	}

	void setDefense(int val)
	{
		defense = val;
	}

};

// 游戏角色
class GameRole
{
private:
	int vitality;	// 生命力
	int attack;		// 攻击力
	int defense;	// 防御力

public:
	int getVitality() const
	{
		return vitality;
	}

	void setVitality(int val)
	{
		vitality = val;
	}

	int getAttack() const
	{
		return attack;
	}

	void setAttack(int val)
	{
		attack = val;
	}

	int getDefense() const
	{
		return defense;
	}

	void setDefense(int val)
	{
		defense = val;
	}

	// 状态显示
	void displayState()
	{
		std::cout << "角色当前状态:" << std::endl;
		std::cout << "体力:" << vitality << std::endl;
		std::cout << "攻击力:" << attack << std::endl;
		std::cout << "防御力:" << defense << std::endl;
		std::cout << std::endl;
	}

	// 获得初始状态
	void getInitState()
	{
		vitality = 100;
		attack = 100;
		defense = 100;
	}

	// 战斗(战斗后死亡)
	void fight()
	{
		vitality = 0;
		attack = 0;
		defense = 0;
	}

	// 保存角色状态
	RoleStateMemento saveState()
	{
		return  RoleStateMemento(vitality, attack, defense);
	}

	// 恢复角色状态
	void recoveryState(RoleStateMemento memento)
	{
		setVitality(memento.getVitality());
		setAttack(memento.getAttack());
		setDefense(memento.getDefense());
	}
};


// 角色状态管理者
class RoleStateCaretaker
{
private:
	RoleStateMemento memento;

public:
	RoleStateMemento getRoleStateMemento() const
	{
		return memento;
	}

	void setRoleStateMemento(RoleStateMemento val)
	{
		memento = val;
	}
};


int main()
{
	GameRole role;
	role.getInitState();
	role.displayState();

	// 保存进度
	std::unique_ptr<RoleStateCaretaker> stateAdmin = std::make_unique<RoleStateCaretaker>();
	stateAdmin->setRoleStateMemento(role.saveState());

	// 战斗
	role.fight();
	role.displayState();

	// 游戏进度恢复
	role.recoveryState(stateAdmin->getRoleStateMemento());

	// 显示状态
	role.displayState();

	system("pause");
	return 0;
}