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

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

代理模式:提供一種可以對真實物件的訪問物件,隱藏真實的物件,去除真實物件的非必要的職責。

大家都喜歡玩遊戲,單機版遊戲如紅警、CS、暗黑了等(不小心就暴露了年齡),網路遊戲如傳奇、魔獸以及吃雞遊戲、王者榮耀等,作為一個會寫程式的遊戲玩家,咱們通過程式設計來實現玩遊戲的過程。

  • 1.介面基類

首先提取出一個介面基類,這個基類中值定義了遊戲的基本流程,登陸賬號、打遊戲、升級、退出賬號等。

#pragma once
#include <string>

//遊戲玩家介面

class IPlayer {
public:
	IPlayer();
	IPlayer(std::string account, std::string pwd);
	~IPlayer();

	//登入遊戲
	virtual void login();
	
	//玩遊戲
	virtual void play();
	
	//升級
	virtual void update();
	
	//退出登入
	virtual void logout();
protected:
	std::string _account;//賬號
	std::string _password;//密碼
}; 
#include "IPlayer.h"

IPlayer::IPlayer(std::string account, std::string pwd) {
	this->_account = account;
	this->_password = pwd;
}

IPlayer::IPlayer() {

}

IPlayer::~IPlayer() {
}

void IPlayer::login() {
}

void IPlayer::play() {

}

void IPlayer::update() {

}

void IPlayer::logout() {

}

好,遊戲的基本介面已經定義完成了。下面咱們定義兩種基本的遊戲玩家,一種是成人遊戲玩家,一種是學社遊戲玩家。因為現在國家對於遊戲有比較嚴格的控制,對於小學生的遊戲玩家也是有時間上的限制的。

  • 2.成人遊戲玩家
#include "IPlayer.h"

IPlayer::IPlayer(std::string account, std::string pwd) {
	this->_account = account;
	this->_password = pwd;
}

IPlayer::IPlayer() {

}

IPlayer::~IPlayer() {
}

void IPlayer::login() {
}

void IPlayer::play() {

}

void IPlayer::update() {

}

void IPlayer::logout() {

}

IPlayer* IPlayer::getProxy() {
	return nullptr;
}
#include "AdultPlayer.h"
#include <stdio.h>

AdultPlayer::AdultPlayer(std::string account, std::string pwd)
:IPlayer( account, pwd) {
}

AdultPlayer::~AdultPlayer() {
}

void AdultPlayer::login() {
	printf("成人遊戲玩家賬號:%s   已經登入了遊戲!\n", _account.c_str());
}

void AdultPlayer::play() {
	printf("成人遊戲玩家賬號:%s   開始打怪!\n", _account.c_str());
}

void AdultPlayer::update() {
	printf("成人遊戲玩家賬號:%s   把大BOSS打死了,升了一級!\n", _account.c_str());
}

void AdultPlayer::logout() {
	printf("成人遊戲玩家賬號:%s   退出了遊戲!\n", _account.c_str());
}

以上就是定義了一個成人的遊戲玩家,那麼咱們定義一個成人遊戲者玩遊戲的場景。

int main() {
	//成人玩家
	IPlayer* player = new AdultPlayer("zhangsan", "123456");
	player->login();

	player->play();

	player->update();

	player->logout();
	
    return 0;
 }

執行一下:
在這裡插入圖片描述

  • 3.學生玩家
class StudentPlayer :public IPlayer {
public:
	StudentPlayer(std::string account, std::string pwd);
	~StudentPlayer();

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

	//玩遊戲
	void play()override;

	//升級
	void update()override;

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

StudentPlayer::StudentPlayer(std::string account, std::string pwd)
:IPlayer(account, pwd) {
}


StudentPlayer::~StudentPlayer() {
}

void StudentPlayer::login() {
	printf("學生遊戲玩家賬號:%s   已經登入了遊戲!\n", _account.c_str());
}

void StudentPlayer::play() {
	printf("學生遊戲玩家賬號:%s   開始打怪!\n", _account.c_str());

}

void StudentPlayer::update() {
	printf("學生遊戲玩家賬號:%s   把大BOSS打死了,升了一級!\n", _account.c_str());
}

void StudentPlayer::logout() {
	printf("學生遊戲玩家賬號:%s   退出了遊戲!\n", _account.c_str());
}

咱們定義一個學生遊戲玩家的使用場景,放假了,小明同學跟媽媽申請想玩遊戲,媽媽也同意了;

int main() {
	//學生玩家
	IPlayer* player2 = new StudentPlayer("xiaoming", "123456");
	player2->login();

	player2->play();

	player2->update();

	player2->logout();

	return 0;
}

執行一下:
在這裡插入圖片描述
小明玩遊戲玩的很高興,但是快樂的日子總是短暫的,要開學了,小明就不能玩遊戲了,但是如果長時間不玩的話,他的遊戲級別就上不去,下次和同學聊天的時候,就感覺比別的同學低了幾級,就不能跟其他的同學炫耀了,一想到這些小明同學就心痛不已。

後來他的同學強強告訴他可以讓遊戲代理來幫他打怪繼續升級,小明一想太棒了,自己不用玩遊戲,但是自己的遊戲級別還是不停的在上升。

  • 4.遊戲代理
class ProxyStudentPlayer :public IPlayer {
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;

	

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() {
	printf("遊戲代理:%s  使用", _proxyName.c_str());
	_studentPlayer->logout();
}

上學期間每次要打遊戲的時候,小明都會讓遊戲代理大強幫自己打遊戲,他只要把遊戲賬號登陸上就可以了。

int main() {
	//學生玩家
	IPlayer* player2 = new StudentPlayer("xiaoming", "123456");
	//代理玩家1
	ProxyStudentPlayer* proxyStudent = new ProxyStudentPlayer("大強", player2);
	proxyStudent->login();

	proxyStudent->play();

	proxyStudent->update();

	proxyStudent->logout();


	return 0;
}

執行一下:
在這裡插入圖片描述

但是他的同學強強嫌每次都要自己登陸很麻煩,就直接把自己的遊戲賬號和密碼告訴遊戲代練大強,讓大強用自己的賬號密碼來登入玩遊戲升級。

	ProxyStudentPlayer* proxyStudent2 = new ProxyStudentPlayer("大強", "qiangqiang", "123456");
	proxyStudent2->login();

	proxyStudent2->play();

	proxyStudent2->update();

	proxyStudent2->logout();

執行一下:
在這裡插入圖片描述