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

大家都喜欢玩游戏,单机版游戏如红警、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. mysql 主从复制 position_mysql 主从复制原理及步骤。
  2. 什么叫「真的理解」?我们对 AI 的要求或许有点过分
  3. CentOS6.5上源码安装MongoDB3.2.1
  4. 一个简单遮罩弹窗效果
  5. Linux 系统的日志管理
  6. Linux高可用性方案之Heartbeat的CRM节点得分计算(原创)
  7. Leet Code OJ 235. Lowest Common Ancestor of a Binary Search Tree [Difficulty: Easy]
  8. word打印版面自动缩小的问题解决
  9. python怎么画图片 wafer map_Python wafer_map包_程序模块 - PyPI - Python中文网
  10. 一个注册表操作类,很有用!
  11. 【Matlab函数知识点合集】新手入门第十四天
  12. win7 计算机 其他 删除,win7双系统怎么删除一个?windows7双系统删除一个方法汇总...
  13. esp32测试wifi速率
  14. 哈尔滨计算机职业学校赵梓琦,哈尔滨赛区复选晋级名单
  15. 编程初学者的一些学习干货笔记
  16. [数论 斐波那契] 51nod1355. 斐波那契的最小公倍数
  17. 深入理解苹果系统(Unicode)字符串的排序方法
  18. 整车EOL 诊断系统
  19. 面试复习题--锁的细枝末节
  20. 笔记-深入理解计算机系统

热门文章

  1. Elo等级分制度(Elo Rating System)的原理
  2. 2019年河源市计算机等级考试,2019年河源中考总分是多少 河源中考时间安排
  3. 2290亿美元,卡塔尔世界杯中国和卡塔尔 都赢了
  4. django 套vue 模板_django-vue-suit
  5. 搜索引擎收录地址入口
  6. 阿里云开放搜索案例(opensearch )
  7. 如何用车辆历史违章查询API接口进行快速开发
  8. jwplayer使用常见问题
  9. java使用idea编译或者打包时出现There are test failures
  10. steam搬砖汇率差项目详解