程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 大話設計模式C++實現-第18章-備忘錄模式

大話設計模式C++實現-第18章-備忘錄模式

編輯:C++入門知識

大話設計模式C++實現-第18章-備忘錄模式


一、UML圖

\

 

二、概念

備忘錄(Memento):在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將對象恢復到原先保存的狀態。

 

三、說明

角色:

(1)Originator(發起人):負責創建一個Memento,用以記錄當前時刻它的內部狀態,並可以使用備忘錄恢復內部狀態。Originator可以根據需要決定Memento存儲Originator的哪些內部狀態。

(2)Memento(備忘錄):負責存儲Originator對象的內部狀態,並可以防止Originator以外的其他對象訪問備忘錄Memento。備忘錄有兩個接口,Caretaker只能看到備忘錄的窄接口,他只能將備忘錄傳遞給其他對象。Originator能夠看到一個寬接口,允許它訪問先前狀態所需的所有數據。

(3)Caretaker(管理者):負責保存包備忘錄Memento,不能對備忘錄的內容進行操作或檢查。

什麼時候用?

Memento模式比較適用於功能比較復雜的,但需要維護或記錄屬性歷史的類,或者需要保存的屬性只是眾多屬性中的一小部分時,Originator可以根據保存的Memento信息還原到遷移狀態。

與命令模式的關系?

如果在某個系統中使用命令模式時,需要實現命令的撤銷功能,那麼命令模式可以使用備忘錄模式來存儲可撤銷操作的狀態。

四、C++實現

(1)Memento.h

 

#ifndef MEMENTO_H
#define MEMENTO_H

#include 
#include 

//Memento類,備忘錄,此處為角色狀態存儲箱RoleStateMemento class
class RoleStateMemento
{
private:
	//生命力
	int vit;
	//攻擊力
	int atk;
	//防御力
	int def;
public:
	RoleStateMemento(int vit,int atk,int def)
	{
		this->vit=vit;
		this->atk=atk;
		this->def=def;
	}
	int GetVitality()
	{
		return vit;
	}
	void SetVitality(int vit)
	{
		this->vit=vit;
	}
	int GetAttack()
	{
		return atk;
	}
	void SetAttack(int atk)
	{
		this->atk=atk;
	}
	int GetDefense()
	{
		return def;
	}
	void SetDefense(int def)
	{
		this->def=def;
	}
};

//Originator,發起人,此處為游戲角色,GameRole class
class GameRole
{
private:
	//生命力
	int vit;
	//攻擊力
	int atk;
	//防御力
	int def;
public:
	int GetVitality()
	{
		return vit;
	}
	void SetVitality(int vit)
	{
		this->vit=vit;
	}
	int GetAttack()
	{
		return atk;
	}
	void SetAttack(int atk)
	{
		this->atk=atk;
	}
	int GetDefense()
	{
		return def;
	}
	void SetDefense(int def)
	{
		this->def=def;
	}

	void GetInitState()
	{
		this->vit=100;
		this->atk=100;
		this->def=100;
	}
	void Fight()
	{
		this->vit=0;
		this->atk=0;
		this->def=0;
	}
	void StateDisplay()
	{
		std::cout<<"當前角色狀態:"<vit<atk<def<vit=memento.GetVitality();
		this->atk=memento.GetAttack();
		this->def=memento.GetDefense();
	}
};

//Caretaker,管理者,此處為游戲角色管理類,RoleStateCaretaker class
class RoleStateCaretaker
{
private:
	RoleStateMemento* memento;
public:
	RoleStateMemento* GetMemento()
	{
		return memento;
	}
	void SetMemento(RoleStateMemento* memento)
	{
		this->memento=memento;
	}
};

#endif


 

(2)Client.h

 

#include "Memento.h"
#include 
#include 

void main()
{
	//大戰Boss前
	GameRole* lixiaoyao=new GameRole();
	lixiaoyao->GetInitState();
	lixiaoyao->StateDisplay();

	//保存進度
	RoleStateCaretaker* stateAdmin=new RoleStateCaretaker();
	stateAdmin->SetMemento(lixiaoyao->SaveState());

	//大戰Boss時,損耗嚴重
	lixiaoyao->Fight();
	lixiaoyao->StateDisplay();

	//恢復之前狀態               
	lixiaoyao->RocoveryState(*stateAdmin->GetMemento());
	lixiaoyao->StateDisplay();

	delete lixiaoyao;
	delete stateAdmin;
	system("pause");
}


 

(3)運行截圖

\

上一篇http://www.Bkjia.com/kf/201412/363552.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved