C++設計模式 - 代理模式詳解一
阿新 • • 發佈:2018-12-24
代理模式:提供一種可以對真實物件的訪問物件,隱藏真實的物件,去除真實物件的非必要的職責。
大家都喜歡玩遊戲,單機版遊戲如紅警、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();
執行一下: