C++设计模式 - 代理模式详解一

版权声明:本文为博主原创文章,未经同意不允许转载! https://blog.csdn.net/wb175208/article/details/84984169

代理模式:提供一种可以对真实对象的访问对象,隐藏真实的对象,去除真实对象的非必要的职责。

大家都喜欢玩游戏,单机版游戏如红警、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();

运行一下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wb175208/article/details/84984169