微信公众号:云计算通俗讲义

持续输出技术干货,欢迎关注!

通过本文你将了解:

  • 背景

  • 概述

  • 模式结构

  • 代码实现

  • 特点

  • 应用场景

背景

在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。

通过引入一个新的对象来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式,通过引入代理对象来间接访问一个对象,这就是代理模式的动机。

概述

代理模式(Proxy Pattern) :给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy或Surrogate,它是一种对象结构型模式。

模式结构

代理模式包含如下角色:

Subject: 抽象主题角色

抽象主题角色声明了真实主题和代理主题的共同接口,实现了调用方和服务方的解耦。

Proxy: 代理主题角色

代理主题角色内部包含对真实主题的引用,从而可以在任何时候操作真实主题对象。

RealSubject: 真实主题角色

真实主题角色定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的方法。

代码实现


//抽象系统类
class AbstractCommonInterface{
public:virtual void run() = 0;
};class MyFunc :public AbstractCommonInterface{
public:virtual void run(){cout << "run..." << endl;}
};class MrFuncProxy:public AbstractCommonInterface{
public:MyFunc*pFunc;string mUserInfo;public:MrSystemProxy(string userInfo){this->mUserInfo = userInfo;pFunc = new MyFunc;}~MyFuncProxy(){if (NULL != pFunc) {delete pFunc;}}virtual void run(){if (checkUserInfo()){cout << "user info is right." << endl;this->pFunc->run();}else{cout << "error." << endl;}}};
void ProxyFunc() {MyFuncProxy* proxy = new MyFuncProxy("root,123");proxy->run();delete proxy;proxy = new MyFuncProxy("admin,123");proxy->run();delete proxy;
}

特点

优点

代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。

虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。

保护代理可以控制对真实对象的使用权限。

缺点

额外增加了代理层,可能造成请求的请求响应变慢。

需要额外增加代理层的实现逻辑,可能会比较复杂。

应用场景

图片代理

在Web中浏览大图一般使用图片代理实现,即用户访问某大图时不时直接加载该图片,这样会很消耗网络带宽,而是采用先向客户端浏览器加载一个小图,然后在后台加载大图,这样可以大幅度提升用户体验。

远程代理

远程代理可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。

虚拟代理

虚拟代理模式是一种内存节省技术,那些占用大量内存或处理复杂的对象将推迟到使用它的时候才创建。

一文详解什么是代理模式相关推荐

  1. k8s service服务发现详解:ipvs代理模式、服务类型

    目录 k8s服务发现Service 理解 Service的实现模型 userspace代理模式 iptables代理模式 ipvs代理模式 Service定义 Service配置清单重要字段 创建Cl ...

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

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

  3. 一文详解Docker 代理脱坑

    本文转载自:一文详解Docker 代理脱坑 Docker 代理配置 由于公司 Lab 服务器无法正常访问公网,想要下载一些外部依赖包需要配置公司的内部代理.Docker 也是同理,想要访问公网需要配置 ...

  4. 一文详解Pandas

    一文详解Pandas 一.Pandas概述 二.Pandas数据结构 2.1 Series 2.2 DataFrame数据结构 二.数学与统计计算 三.DataFrame的文件操作 3.1 读取文件 ...

  5. 时空之轮Android手柄,时空之轮图文完整攻略(超时空之轮(ChronoTrigger)最详细攻略图文详解)...

    时空之轮图文完整攻略(超时空之轮(ChronoTrigger)最详细攻略图文详解),哪吒游戏网给大家带来详细的时空之轮图文完整攻略(超时空之轮(ChronoTrigger)最详细攻略图文详解)介绍,大 ...

  6. 一文详解自动驾驶的动态驾驶任务(DDT) | 自动驾驶系列

    文章版权所有,未经授权请勿转载或使用 本系列上篇文章<一文详解自动驾驶的运行设计域(ODD)>解读了什么是自动驾驶ODD,本篇文章依据SAE J3016详细解读自动驾驶DDT.DDT fa ...

  7. asterisk配置文详解

    asterisk配置文详解 Configuration GuideYou've  installed Asterisk and verified that it will  start up.Now ...

  8. 一文详解编程中的随机数

    一文详解编程中的随机数 随机数的类型 真随机数生成器 TRNG - True Random Number Generator 伪随机数生成器 PRNG - Pseudo Random Number G ...

  9. 一文详解 ChatGPT:背后的技术,数据,未来发展

    文章目录 一文详解 ChatGPT ChatGPT背后的技术 基于 Transformer 的预训练语言模型 提示学习与指令精调 思维链(Chain of Thought,COT) 基于人类反馈的强化 ...

  10. 一文详解构造函数和析构函数

    一文详解构造函数和析构函数 一.对象的初始化和清理 二.析构函数 三.构造函数可以重载 四.默认构造函数和默认析构函数 五.拷贝构造函数 5.1 编译器提供了默认的构造函数 5.2 拷贝构造函数中形参 ...

最新文章

  1. python入门教程非常详细-Python编程入门教程:从入门到高级,非常详细
  2. 使用ffmpeg循环推流(循环读取视频文件)推送RTMP服务器的方法
  3. python flask flash消息闪现
  4. python第三方插件登录网易音乐_python3-使用requests模拟登录网易云音乐
  5. Rust:集所有语言之大成者
  6. wxWidgets:显示和测试 wxDC 功能
  7. InvokeHelper:多线程修改主界面控件属性并调用其中方法
  8. php mysql 全文检索_MySQL中文全文检索
  9. python文件系统_你应该知道的10个Python文件系统方法
  10. wildfly-9.0.2 web项目部署详细步骤
  11. Python捕捉命令输出、错误输出及赋值命令到变量的方法
  12. WORD中如何进行双行合一
  13. 单机dnf正在连接服务器,dnf提示正在连接服务器解决方案
  14. 解决 Adobe 系列绿色版本无法打开的问题
  15. 完整版28K易支付系统源码+第四方Oreo支付源码
  16. 51Job行业分类和行业编号汇总,格式:Json
  17. 一场面试过后—移动前端开发
  18. [NISACTF 2022]
  19. 快点射!(Swift Injection) 不带这样的!
  20. 滤波器主要参数及特性

热门文章

  1. 脑科学家:神经科学与大数据的结合带来的新领域
  2. scratch编程 超有趣反应力游戏
  3. 【历史上的今天】5 月 25 日:雅虎与 eBay 联盟;第一次国际万维网会议;Google 街景发布
  4. 发货单分期发货分期收款
  5. 百度、高德地图数据源是哪里?
  6. 加快 apk 的编译速度
  7. Mac中使用Mounty对NTFS文件进行读写操作,报错“卷不能在读/写模式下重新挂载,可能是因为先前没有完全卸载(安全删除)”问题的解决
  8. sata7p 定义_SATA接口定义
  9. 用IDEA在Windows上搭建chisel代码阅读环境——以香山处理器为例
  10. 1024 程序员节狂欢盛会,等了一年终于来了!