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

大家都喜欢玩游戏,单机版游戏如红警、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");//代理玩家1ProxyStudentPlayer* 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();

运行一下:

C++设计模式 - 代理模式详解一相关推荐

  1. 软件设计模式——代理模式详解

    摘要 动态代理是Java语言中非常经典的一种设计模式,也是所有设计模式中最难理解的一种.那什么是代理设计模式?代理设计的基础概念就是通过代理控制对象的访问,可以在这个对象调用方法之前.调用方法之后去处 ...

  2. cglib动态代理jar包_代理模式详解:静态代理+JDK/CGLIB 动态代理实战

    1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...

  3. 代理模式详解(静态代理和动态代理的区别以及联系)

    原文链接:https://www.cnblogs.com/takumicx/p/9285230.html 1. 前言 代理模式可以说是生活中处处可见.比如说在携程上定火车票,携程在这里就起到了一个代理 ...

  4. 设计模式——状态模式详解

    0. 前言 写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦 ...

  5. java设计模式之代理模式详解

    代理模式在Java中十分常见,有如Spring实现AOP而使用动态代理,更有RPC实现中使用的调用端调用的代理服务.代理模型除了是一种设计模式之外,它更是一种思维,所以探讨并深入理解这种模型是非常有必 ...

  6. Spring AOP理论 +代理模式详解

    目录 1.理解AOP 1.1.什么是AOP 1.2.AOP体系与概念 1.3.Spring AOP 通知的执行顺序 2.代理模式 2.1.静态代理 2.2.静态代理的缺点 3.动态代理 JDK 动态代 ...

  7. 代理模式详解(包含原理详解)

    http://www.cnblogs.com/zuoxiaolong/p/pattern3.html 作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为 ...

  8. (二)代理模式详解(包含原理详解)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处. 我特意将本系列改了下名字,原名是<设计模式学习之路>,原因是因为之前写过一篇<spring源码学习之路>,但是 ...

  9. 静态代理与动态代理模式详解(优缺点分析,实例分析,读源码必备)

    1.代理模式 (1)概念 代理就是帮别人做事情,如:工厂的中介,中介负责为工厂招收工人,那么中介就是工厂的代理:客户通过商家购买东西,商家向厂家购买货物,商家就是工厂的代理 在开发中存在a类需要调用c ...

最新文章

  1. 悉尼大学计算机研究生学制,悉尼大学研究生学制
  2. 用python画漂亮图片-python结合G2绘制精美图形
  3. C# 集合类(三):Stack
  4. Spring Data REST API集成Springfox、Swagger
  5. 想要学习设计模式,你得先会看类图,一张图读懂UML
  6. redis的源码编译安装+发布订阅+RDB持久化
  7. ie浏览器ip代理怎么设置
  8. 金银花跟黄芪泡水有什么功效?
  9. 并发容器Map之一:ConcurrentHashMap原理(jdk1.8)
  10. NLPIR汉语分词(Java调用 使用IDEA )
  11. gateway中的局部过滤器_SpringCloud系列Gateway:过滤器总结
  12. python制作gif动图_PIL生成透明GIF动图
  13. 听课记录范文计算机基础,【教师听课记录范文】_听课记录范文三篇
  14. 微信支付-扫码支付方式在ThinkPHP商城中的使用(第二部分)
  15. Mongodb 查询重复数据
  16. 论坛IP签名档PHP源码,简单几步,教你制作自己的显IP签名档
  17. 4月22日 常用函数
  18. 动态规划:8行代码搞定最大子数组和问题
  19. 说说throw和throws关键字的区别?
  20. DSPTMS320F28335_SCI详解

热门文章

  1. 点击图片显示另外一张图片
  2. Spark期末大作业
  3. Android中SeLinux权限 .te文件编写
  4. 惯性思维与创新发现的矛盾
  5. 1 郭老师的冰糖葫芦
  6. 电容型号和品牌的查询
  7. 用bs4和requests库,抓取nga舰队Collection萌战玩家投票
  8. XNA游戏开发之2D游戏
  9. 格林威治时间转换成字符串
  10. JAVA整合阿里云ONS(RocketMQ)