1. 程式人生 > >C++設計模式 - 代理模式詳解二

C++設計模式 - 代理模式詳解二

  • 5.遊戲代練收費

上一篇文章提到了小明請遊戲代練來幫助自己打遊戲升級,但是遊戲代練也不是白幫你玩的,小明需要付費給遊戲代練。

咱們定義一個付費的介面基類。

class ICost {
public:
	ICost();
	~ICost();

	virtual void money();
};

#include "ICost.h"

ICost::ICost() {
}

ICost::~ICost() {
}

void ICost::money() {

然後讓遊戲代練繼承這個介面,並且實現這個介面

class ProxyStudentPlayer :public IPlayer, public ICost {
public:
	ProxyStudentPlayer(std::string name, std::string account, std::string pwd);
	ProxyStudentPlayer(std::string name,IPlayer* player);
	~ProxyStudentPlayer();

	//登入遊戲
	void login()override;

	//玩遊戲
	void play()override;

	//升級
	void update()override;

	//退出登入
	void logout()override;

	//遊戲代練費用
	void money()override;

private:
	std::string _proxyName;
	IPlayer* _studentPlayer;
};

ProxyStudentPlayer::ProxyStudentPlayer(std::string name, std::string account, std::string pwd)
:IPlayer(account, pwd) {
	_proxyName = name;
	_studentPlayer = new StudentPlayer(account, pwd);
}

ProxyStudentPlayer::ProxyStudentPlayer(std::string name, IPlayer* player) {
	_proxyName = name;
	_studentPlayer = player;
}

ProxyStudentPlayer::~ProxyStudentPlayer() {
		
}

void ProxyStudentPlayer::login() {
	printf("遊戲代理:%s  使用", _proxyName.c_str());
	_studentPlayer->login();
}

void ProxyStudentPlayer::play() {
	printf("遊戲代理:%s  使用", _proxyName.c_str());
	_studentPlayer->play();
}

void ProxyStudentPlayer::update() {
	printf("遊戲代理:%s  使用", _proxyName.c_str());
	_studentPlayer->update();
}

void ProxyStudentPlayer::logout() {
	money();
	printf("遊戲代理:%s  使用", _proxyName.c_str());
	_studentPlayer->logout();
}

void ProxyStudentPlayer::money() {
	printf("本次遊戲代練需要費用:200元\n");
}

通過程式碼可以看出,在由此代練退出賬號的時候,會呼叫介面money()這個方法,計算出這個遊戲代練需要費用,然後去找小明索取。

客戶端程式碼不用修改,咱們直接執行一下看看結果:
在這裡插入圖片描述

通過以上示例可以看出,真實的物件和客戶端都沒有修改,只是修改了代理類,就完成了費用計算的功能。

這樣做就解耦物件的核心功能和非核心功能。通過在代理類上新增一些非核心功能實現真實物件的功能擴充套件。