一、定义

代理设计模式为另一个类提供了一对一的转发接口:调用代理类的FunctionA()将导致调用原始类中的FunctionA()。也就是说,代理类和原始类有相同的接口。

二、结构

接口 + 真实实现类 + 代理类

三、Proxy模式适用的场景

1.Virtual Proxy:通过代理的模式对消耗资源比较大的对象做了一个延迟加载,即什么时候用到这个对象了才去创建它;

2.Remote Proxy:为处于不同地址空间的对象提供一个本地代理。常见的例子就是Java RMI(Remote Method Invocation) stub对象。stub对象作为Proxy,对stub对象的调用将会使stub对象与位于远程机器上的skeleton对象进行通信并对其进行相应的调用。

3.Protective Proxy:控制真实对象的访问权限。在传递请求给真实对象前,Proxy对象会检查调用者是否拥有访问权限。

4.Smart Proxy:当真实对象被访问时,会做一下额外的操作。比如:

1>计算对真实对象的引用次数,当引用次数为0时自动析构真实对象(即智能指针);

2>当真实对象第一次被引用时,将真实对象加载到内存中;

3>在真实对象被访问前检查真实对象是否被lock,确保真实对象不能被其他对象改变。

四、优缺点:

优点:

1.代理作为调用者和真实对象的中间层,降低了模块间和系统的耦合性;

2.可以以一个小对象代理一个大对象,达到优化系统提高运行速度的目的:

//No Proxy
class RealPicture
{
public:RealPicture(){mid = g_Id;std::cout << "ctor: " << mid << std::endl;g_Id++;}~RealPicture(){std::cout << "dtor: " << mid << std::endl;}void Draw(){std::cout << "drawing picture: " << mid << std::endl;}private:int mid;static int g_Id;
};int RealPicture::g_Id = 1;int main()
{RealPicture realPicture[3];realPicture[1].Draw();
}

Output:

// Use Proxy
class IPicture
{
public:virtual void Draw() = 0;
};class RealPicture: public IPicture
{
public:RealPicture(int id): mid(id){std::cout << "ctor: " << mid << std::endl;}~RealPicture(){std::cout << "dtor: " << mid << std::endl;}void Draw() override{std::cout << "drawing picture: " << mid << std::endl;}private:int mid;
};class ProxyPicture : public IPicture
{
public:ProxyPicture(){mid = g_Id;g_Id++;}~ProxyPicture(){if(!realPicture)delete realPicture;}void Draw() override{if (!realPicture){ std::unique_lock<std::mutex> ulock(mMutex);if (!realPicture)realPicture = new RealPicture(mid);}realPicture->Draw();}private:RealPicture* realPicture = nullptr;std::mutex mMutex;int mid = 0;static int g_Id;
};int ProxyPicture::g_Id = 1;int main()
{ProxyPicture picture[3];picture[1].Draw();
}

output:

3.提供真实对象的权限管理;

4.易扩展。真实对象和代理对象都接口化了,真实对象更改业务后只要接口不变,代理对象可以不做任何改变。

缺点:

1.对比优点1,因为调用者和真实对象多了一个中间层,所以会增加调用响应的时间。

五、动态代理

以上的介绍都是基于静态代理,即代理关系都是固定的。当代理多个真实对象的时候就要写多个代理类,并且会产生冗余的代码,扩展性和可维护性都不高,而动态代理是基于反射实现了在程序运行的过程中才决定代理什么对象。像AOP的核心思想就是动态代理。

先记一下,后面再研究。

参考资料:

《C++ API设计》

https://sourcemaking.com/design_patterns/proxy

https://sourcemaking.com/design_patterns/proxy/cpp/1

https://www.oodesign.com/proxy-pattern.html

[设计模式] - Proxy代理模式相关推荐

  1. Java设计模式-Proxy代理模式

    问题分析: 什么是代理模式呢?其实我们在生活中并不少见.对于程序员来说最常接触的莫过于代理上网了,连接大力服务器地址,就可以访问网络. 还有每天吃饭赶进度是常事,叫公司的同事帮忙带饭也是一种代理:如果 ...

  2. [C++设计模式] proxy 代理模式

    代理模式:为其它对象提供一种代理以控制对这个对象的訪问. Proxy: 保存一个引用使得代理能够訪问实体.若RealSubject和Subject的接口同样,Proxy会引用Subject,就相当于在 ...

  3. 设计模式之代理模式(Proxy)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  4. 三国杀与设计模式之代理模式(Proxy)

    本人原博地址:http://blog.saymagic.cn/blog.php?id=17 三国杀案例:在五人局中,作为反贼的黄月英借黄忠的刀杀作为忠臣的夏侯惇,从这句话中我们可以总结出一个成语对不对 ...

  5. 【设计模式】代理模式 ( 动态代理 | 模拟 Java 虚拟机生成对应的 代理对象 类 )

    文章目录 前言 一.模拟 JVM 生成对应的 代理对象 二.模拟 JVM 生成对应的 代理对象 完整流程展示 1.目标对象接口 2.被代理对象 3.调用处理程序 4.模拟 JVM 生成的代理对象类 5 ...

  6. C++设计模式之代理模式

    这篇文章主要介绍了C++设计模式之代理模式,本文讲解了什么是代理模式.代理模式的使用场合.代理模式的实现代码等内容,需要的朋友可以参考下 前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就 ...

  7. python中代理模式分为几种_Python设计模式之代理模式实例详解

    本文实例讲述了Python设计模式之代理模式.分享给大家供大家参考,具体如下: 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 #!/usr/bin/env py ...

  8. 设计模式笔记——代理模式

    设计模式笔记--代理模式 代理模式介绍 代理模式通常是介于请求方和提供方的一个中介系统,请求方是发送请求的一方,提供方是根据请求提供相应资源的一方 Web中的代理服务器就是一个例子,客户端向代理服务器 ...

  9. 「设计模式(五) - 代理模式」

    「设计模式(五) - 代理模式」 一.处处可见的"代理" "代理"在平常生活司空见惯,点外卖,租房子找中介,买飞机票等等.基本上用手机就能完成,也就是不直接接触 ...

最新文章

  1. linux 命令 读phy_CentOS教程(七)- 常用命令使用介绍(上)
  2. easyui的datagrid的使用记录
  3. [翻译]Axure-Basic Interactions-原型设计工具Axure学习-第1.3节
  4. Codeforces Round #476 (Div. 2) B. Battleship
  5. Leetcode之二叉树(前200道)
  6. OpenJudge计算概论-字符串排序
  7. 笔记本启动与关闭自带键盘
  8. linux的虚拟机部署项目,在虚拟机上部署Web项目
  9. 数论及Python实践
  10. python 趋势线计算式_[原创]图表趋势线公式系数的计算公式
  11. c++有关iostream和iostream.h
  12. 小学数学计算机按键名称,数学计算器
  13. 【计算机视觉40例】案例39:易容术(换脸术、合成人脸)
  14. 输入电容及DCM-CCM-QR变压器计算
  15. 4.10 选择性滤波器
  16. Android模拟登录教务系统(强智系统)
  17. 3D房地产营销PPT模板
  18. 大数据24小时:地质局发布地质大数据共享平台,科大讯飞将语音识别植入腾讯小Q机器人
  19. 快乐AK场2 E 删删删越小越好 单调栈
  20. 大数据系列——什么是hive?hive用来干什么的?hive常见问题是啥?

热门文章

  1. fastapi学习(一):输出hello world与基本运行方法
  2. 推荐系统学习(三)SVD奇异值分解做推荐与python代码
  3. Numpy数据分析数值范围调整、计算
  4. list多选 android,Android ExpandableListView单选以及多选实现代码
  5. PS2018学习笔记(30-35节)
  6. PIC18F26K20
  7. eclips git中的add to Index无效解决
  8. ide中tomcat乱码_idea tomcat 乱码问题的解决及相关设置
  9. (217)如何选择硬件描述语言
  10. (54)Verilog HDL下升沿采样