设计模式---行为类型---备忘录

1、意图

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

2、动机

有时有必要记录一个对象的内部状态。为了允许用户取消不确定的操作或从错误中恢复过来,需要实现检查点和取消机制,而要实现这些机制,你必须事先将状态信息保存在某处,这样才能将对象恢复到它们先前的状态。但是对象通常封装了其部分或所有的状态信息,使得其状态不能被其他对象访问,也就不可能在该对象之外保存其状态。而暴露其内部状态又将违反封装的原则,可能有损应用的可靠性的可扩展性。

3、适用性

在以下情况下使用备忘录模式:

1)必须保存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。

2)如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

4、C++实例

// Test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
using namespace std;

class CRoleStateMemento
{
public:

	int m_vit;

	int m_def;

	int m_atk;

public:

	CRoleStateMemento(int vit,int def,int atk)
	{
		m_atk=atk;
		m_def=def;
		m_vit=vit;
	}

	int GetVit()
	{
		return m_vit;
	}

	void SetVit(int vit)
	{
		m_vit=vit;
	}

	int GetAttack()
	{
		return m_atk;
	}

	void SetAttack(int attack)
	{
		m_atk=attack;
	}

	int GetDef()
	{
		return m_def;
	}

	void SetDef(int def)
	{
		m_def=def;
	}
};

class CGameRole
{
public:

	int m_vit;

	int m_atk;

	int m_def;

public:

	int GetVit()
	{
		return m_vit;
	}

	void SetVit(int vit)
	{
		m_vit=vit;
	}

	int GetAttack()
	{
		return m_atk;
	}

	void SetAttack(int attack)
	{
		m_atk=attack;
	}
	int GetDef()
	{
		return m_def;
	}

	void SetDef(int def)
	{
		m_def=def;
	}

	void StateDisplay()
	{
		cout<<"角色当前状态: "<<endl;
		cout<<"体力: "<<m_vit;
		cout<<"攻击力: "<<m_atk;
		cout<<"防御力: "<<m_def<<endl;
	}

public:

	void GetInitstate()
	{
		m_def=100;
		m_atk=100;
		m_vit=100;
	}

	void Fight()
	{
		m_vit=0;
		m_atk=0;
		m_def=0;
	}

public:

	CRoleStateMemento* SaveState()
	{
		return (new CRoleStateMemento(m_vit,m_atk,m_def));
	}

	void RecoveryState(CRoleStateMemento* memento)
	{
		m_def=memento->m_def;
		m_atk=memento->m_atk;
		m_vit=memento->m_vit;
	}

};

class CRoleStateCaretaker
{
public:

	CRoleStateMemento* m_memento;

public:

	CRoleStateMemento* GetMemento()
	{
		return m_memento;
	}

	void SetMemento(CRoleStateMemento* memento)
	{
		m_memento=memento;
	}
};
int _tmain(int argc, _TCHAR* argv[])
{
	CGameRole* pwangyixiao=new CGameRole;
	pwangyixiao->GetInitstate();
	pwangyixiao->StateDisplay();

	CRoleStateCaretaker* pwangyixiaostate=new CRoleStateCaretaker;
	pwangyixiaostate->m_memento=pwangyixiao->SaveState();

	pwangyixiao->Fight();
	pwangyixiao->StateDisplay();


	pwangyixiao->RecoveryState(pwangyixiaostate->m_memento);
	pwangyixiao->StateDisplay();


	delete pwangyixiao;
	delete pwangyixiaostate->m_memento;
	delete pwangyixiaostate;
	
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值