代理模式定义

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端对象之间起到中介的作用。

​ 代理类和被代理的类具有共同接口。

代理模式的应用场景

1、在不同机器上服务器上的应用

​ A机器服务要和B服务器的通信,A服务器请求B服务器执行doXXX()方法,两个服务器都要进行开发,然而B服务器还没开发好,A机器服务已经做好,则A机器服务无法测试,此时A机器服务测试可以通过代理模式用代理类模拟一个真正B机器上的服务模块。

2、web服务器

用户输入域名访问web服务,用户在网页点击网页某个地方就会触发去访问web请求资源,web服务要解释请求访问的数据,再返回去给用户。

如果是直接访问web服务器,这个过程费时费力,当大量用户访问web服务器就会造成网络拥堵、服务崩溃等,所以中间搞了个缓冲服务器起到代理作用,就如代理模式的定义一样为其他对象提供一种代理以控制对这个对象的访问。当用户访问的数据在缓冲服务器上有且是最新的就不会去访问web服务器,会直接从缓冲服务器上返回用户请求的数据。

3、代理服务器

你有张良计,我有过墙梯?法外狂徒张三

代理模式示例图

Subject —— 抽象主题角色(抽象类),真实主题与代理主题的共同接口(继承同一抽象父类)

RealSubject —— 真实主题角色(被代理的对象), 即代理角色所代表的真实对象。

简单的代理模式案例

假设现在有一个系统,用户要执行这个系统,但不是随意都可以执行,必须要一定权限才能执行,假设权限就是要提供正确用户名和密码才能执行。

抽象主题:

class AbstractCommon{public:virtual void run() = 0;
};

真实主题:

#include "AbstractCommon.h"
#include <iostream>using namespace std;class MySystem : public AbstractCommon{public:virtual void run();
};void MySystem::run(void)
{cout << "My System is running" << endl;
}

代理主题:

#include "AbstractCommon.h"
#include "MySystem.h"class ProxySystem : public AbstractCommon{private:MySystem *mSystem;string mUserName;string mPassword;bool IsUserNameRight(void);bool IsPasswordRight(void);
public:virtual void run();void SetUserName(string username);void SetPassword(string password);ProxySystem();~ProxySystem();
};ProxySystem::ProxySystem()
{mSystem = new MySystem;
}ProxySystem::~ProxySystem()
{if (mSystem != NULL){delete mSystem;}
}void ProxySystem::run() //通过这个函数代理执行真正的系统
{if (IsUserNameRight() && IsPasswordRight())  //加上用户名和密码验证正确权限控制访问{cout << "系统登录成功" << endl;mSystem->run();}else{cout << "用户名或密码错误, 请检查" << endl;}
}bool ProxySystem::IsUserNameRight(void)
{if (mUserName == "Ares"){return true;}return false;
}bool ProxySystem::IsPasswordRight(void)
{if (mPassword == "123456"){return true;}return false;
}void ProxySystem::SetUserName(string username)
{mUserName = username;
}void ProxySystem::SetPassword(string password)
{mPassword = password;
}

main函数:

#include <iostream>
#include "Proxy.h"using namespace std;int main()
{ProxySystem *proxy = new ProxySystem;proxy->SetUserName("Ares");proxy->SetPassword("123456");proxy->run();    //通过代理来执行   delete proxy;return 0;
}

设计模式学习 — 代理模式相关推荐

  1. swift设计模式学习 - 代理模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 代理模式 代理模式为其他对象提供一种代理以控制对这个对象的访问,在某些情况下,一个对象不适合或者不能直接引用另一个对象 ...

  2. (@WhiteTaken)设计模式学习——代理模式

    今天学习了一下代理模式,代理模式分为很多种.目前感觉有两种是需要学习一下的. 静态代理模式 动态代理模式 1. 静态代理模式 需要被代理的类,实现一个或者多个接口. 代理类需要实现被代理类的接口,在此 ...

  3. JS设计模式学习 - 代理模式

    代理模式(Proxy) 为一个对象提供一个代用品或占位符,以便控制对它们的访问. 代理模式是一种非常有意义的模式,在生活中可以找到很多代理模式的场景.比如,明星都有经纪人作为代理. 代理模式的关键是, ...

  4. 设计模式学习——代理模式(Proxy Pattern)

    放假啦~学生们要买车票回家了,有汽车票.火车票,等.但是,车站很远,又要考试,怎么办呢?找代理买啊,虽然要多花点钱,但是,说不定在搞活动,有折扣呢~ 1 /// 2 /// @file Selling ...

  5. 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式

    1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...

  6. 设计模式——从 LOL 中学习代理模式

    从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔强的黑铁,今年 S10 的总决赛在上海举行,这个事儿 ...

  7. 设计模式:代理模式(C++)【代理服务器案例】

    代理模式介绍 今天继续学习设计模式,今天我们来学习代理模式.其实这个模式呢在我们的生活早已经运用起来了.笔者看到这个模式就联想到了代理商.我们客户买东西一般都是经过代理商的,代理商和真正的生成产品的公 ...

  8. Javascript 设计模式之代理模式【讲师辅导】-曾亮-专题视频课程

    Javascript 设计模式之代理模式[讲师辅导]-969人已学习 课程介绍         随着 javascript ES6/7 的发布,很多老版本的设计模式的实现,今天来看是错误的,将被彻底. ...

  9. 23种设计模式之代理模式

    文章目录 代理模式的定义与特点 代理模式的结构与实现 模式的结构 模式的实现 代理模式的应用场景 代理模式的应用实例 代理模式的扩展 代理模式分类 静态代理 动态代理 在有些情况下,一个客户不能或者不 ...

  10. 从零开始单排学设计模式「代理模式」青铜 III

    阅读本文大概需要 3.2 分钟. 本篇是设计模式系列的第六篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了 ...

最新文章

  1. 软件测试技术篇:UI自动化到底是难是易?
  2. charles和Fiddler感觉哪个更好用
  3. matlab ezplot hold,matlab中的ezplot函数
  4. 重温强化学习之无模型学习方法:TD(lambda)
  5. Python-day06-2018.7.9_编码以及小知识点补充
  6. 安装Cornerstone3.1注意点
  7. 云应用基础技术成熟需七年时间
  8. Miniprofiler在普通net项目中的使用
  9. 企业类库 add access 2007
  10. requestmapping配置页面后_第004课:Spring Boot 项目属性配置
  11. C语言指针-从底层原理到花式技巧,图文和代码给你讲解透彻
  12. Centos6.6系统root用户密码恢复案例(转)
  13. 按之字形顺序打印二叉树(C++)
  14. linux设置自动关机命令,Linux中Shutdown命令实现定时自动关机
  15. java 定时任务 单元测试_介绍java 定时任务最简单的3种实现方法
  16. 线程启动、结束,创建线程多法、join,detach
  17. 努力赚钱,是为了不让自己的爱情受到别人金钱的考验--这就是现实
  18. Stellarium0.9.0新功能
  19. [20][01][02] 安全认证
  20. web day2 作业

热门文章

  1. Hadoop生态圈(十八)- HDFS Transparent Encryption透明加密
  2. 服务器数据恢复的两种方法
  3. 过滤器把样式过滤掉,无法显示样式问题, 处理方法
  4. 【转】安装虚拟机VMware及在VMware下安装Ghost XP系统图文教程(附PQ分区及VMware共享教程)
  5. 2021-06-16 解决MDK5使用STLINK下载不进去程序报错的问题
  6. Java流处理之高效读写的缓冲流
  7. 【推荐】泰坦尼克号乘客生存分析——用机器学习告诉你,如果你在当时的船上,有多大机率生还?
  8. 什么是DNS over HTTPS?
  9. 高德地图的集成(简单至极)
  10. 移动硬盘里面装linux系统,在移动硬盘上安装Ubuntu和其他linux系统-随身携带操作系统...