代理模式:提供一种可以对真实对象的访问对象,隐藏真实的对象,去除真实对象的非必要的职责。
大家都喜欢玩游戏,单机版游戏如红警、CS、暗黑了等(不小心就暴露了年龄),网络游戏如传奇、魔兽以及吃鸡游戏、王者荣耀等,作为一个会写程序的游戏玩家,咱们通过编程来实现玩游戏的过程。
首先提取出一个接口基类,这个基类中值定义了游戏的基本流程,登陆账号、打游戏、升级、退出账号等。
#pragma once
#include
//游戏玩家接口
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() {
}
好,游戏的基本接口已经定义完成了。下面咱们定义两种基本的游戏玩家,一种是成人游戏玩家,一种是学社游戏玩家。因为现在国家对于游戏有比较严格的控制,对于小学生的游戏玩家也是有时间上的限制的。
#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
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;
}
运行一下:
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;
}
运行一下:
小明玩游戏玩的很高兴,但是快乐的日子总是短暂的,要开学了,小明就不能玩游戏了,但是如果长时间不玩的话,他的游戏级别就上不去,下次和同学聊天的时候,就感觉比别的同学低了几级,就不能跟其他的同学炫耀了,一想到这些小明同学就心痛不已。
后来他的同学强强告诉他可以让游戏代理来帮他打怪继续升级,小明一想太棒了,自己不用玩游戏,但是自己的游戏级别还是不停的在上升。
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();
运行一下: