代理模式:为其它对象提供一种代理以控制对这个对象的訪问。

Proxy:

保存一个引用使得代理能够訪问实体。若RealSubject和Subject的接口同样,Proxy会引用Subject,就相当于在代理类中保存一个Subject指针。该指针会指向RealSubject。
提供一个与Subject的接口同样的接口,这样代理就能够用来替代实体。
控制对实体的存取。并可能负责创建和删除它;
其他功能依赖于代理的类型,比如:
远程代理负责对请求及其參数进行编码,并向不同地址空间中的实体发送已编码的请求;
虚代理能够缓存实体的附加信息,以便延迟对它的訪问。
保护代理检查调用者是否具有实现一个请求所必须的訪问权限。

Subject:定义RealSubject和Proxy的共用接口。这样就在不论什么使用RealSubject的地方都能够使用Proxy;

RealSubject:定义Proxy所代理的实体。

1、远程代理为一个对象在不同的地址空间提供局部代理;
2、虚代理依据需求创建开销非常大的对象。
3、保护代理控制原始对象的訪问;保护代理用于对象应该有不同的訪问权限的时候;
4、智能引用代替了简单的指针,它在訪问对象时运行一些附加操作。它的典型用途包含:
       对指向实际对象的引用计数,这样当该对象没有引用时,能够自己主动释放它;

引用计数智能指针:

#include <iostream>
#include <windows.h>
using namespace std;#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }class KRefCount
{
public:KRefCount():m_nCount(0){}public:unsigned AddRef(){ return InterlockedIncrement(&m_nCount); }unsigned Release(){ return InterlockedDecrement(&m_nCount); }void Reset(){ m_nCount = 0; }private:unsigned long m_nCount;
};template <typename T>
class SmartPtr
{
public:SmartPtr(void): m_pData(NULL){m_pReference = new KRefCount();m_pReference->AddRef();}SmartPtr(T* pValue): m_pData(pValue){m_pReference = new KRefCount();m_pReference->AddRef();}SmartPtr(const SmartPtr<T>& sp): m_pData(sp.m_pData), m_pReference(sp.m_pReference){m_pReference->AddRef();}~SmartPtr(void){if (m_pReference && m_pReference->Release() == 0){SAFE_DELETE(m_pData);SAFE_DELETE(m_pReference);}}inline T& operator*(){return *m_pData;}inline T* operator->(){return m_pData;}SmartPtr<T>& operator=(const SmartPtr<T>& sp){if (this != &sp){if (m_pReference && m_pReference->Release() == 0){SAFE_DELETE(m_pData);SAFE_DELETE(m_pReference);}m_pData = sp.m_pData;m_pReference = sp.m_pReference;m_pReference->AddRef();}return *this;}SmartPtr<T>& operator=(T* pValue){if (m_pReference && m_pReference->Release() == 0){SAFE_DELETE(m_pData);SAFE_DELETE(m_pReference);}m_pData = pValue;m_pReference = new KRefCount;m_pReference->AddRef();return *this;}T* Get(){T* ptr = NULL;        ptr = m_pData;return ptr;}void Attach(T* pObject){if (m_pReference->Release() == 0){SAFE_DELETE(m_pData);SAFE_DELETE(m_pReference);}m_pData = pObject;m_pReference = new KRefCount;m_pReference->AddRef();}T* Detach(){T* ptr = NULL;if (m_pData){           ptr = m_pData;m_pData = NULL;m_pReference->Reset();}return ptr;}private:KRefCount* m_pReference;T* m_pData;
};class CTest
{
public:CTest(int b) : a(b) {}
private:int a;
};int main()
{SmartPtr<CTest> pSmartPtr1(new CTest(10));SmartPtr<CTest> pSmartPtr2(new CTest(20));pSmartPtr1 = pSmartPtr2;
}

智能指针使用引用计数实现时,就是最好的使用代理模式的样例。在上面的样例中,SmartPtr就是一个代理类。而T* m_pData才是实际的数据。

SmartPtr代理实际的数据,去实现了指针的行为。加入了引用计数,从而实现了智能指针。

转载于:https://www.cnblogs.com/clnchanpin/p/6821972.html

[C++设计模式] proxy 代理模式相关推荐

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

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

  2. [设计模式] - Proxy代理模式

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

  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. Nginx 为什么这么快?
  2. getopt java_使用 Getopt::Std 的命令行开关
  3. 一文了解YOLO-v4目标检测
  4. 句法分析:依存分析(Dependency Parsing)
  5. SAP CRM系统里的附件存储逻辑
  6. 疲劳容器的定义_材料疲劳
  7. Ios tab Bar 使用方法
  8. WordPress /wp-admin/includes/post.php user_ID 参数操作权限提升漏洞
  9. 7 面阿里,终获 Offer《原力计划【第二季】》第 9周周榜揭晓!!!
  10. GitHub上最火的40个Android开源项目(二)
  11. Android初学第32天
  12. 这 26个中国式创新,征服了全世界
  13. 实对称矩阵的特征值求法_矩阵论系列——特征值篇
  14. MergeSort(C++)
  15. 易语言学习笔记(1)
  16. mfc 配合directshow
  17. 四元数、欧拉角、旋转矩阵、旋转向量之间的转换
  18. 分块矩阵求逆(推导)
  19. 【LTspice】【LTspice添加第三方***.lib文件】
  20. twitter推文案例

热门文章

  1. mysql查到库怎么进入表_mysql如何进入数据库查看所有表
  2. linkedin api php,php – 如何使用linkedin api发送消息/通知?
  3. antd mysql_create-react-app使用antd按需加载的样式无效问题的解决
  4. python多分类画roc曲线_利用python制作ROC曲线进行多分类
  5. python一条线分段显示颜色_Python诅咒显示分段fau
  6. c语言socket段错误,(Qtcpsocket)退出程序时提示段错误的解决
  7. C语言#define预处理
  8. html设置外边距不合并,CSS外边距合并代码
  9. oracle连接eclipse的包,【求助】eclipse导入了Oracle的驱动包连不上Oracle
  10. java stream groupingBy(classifier, downstream, mapFactory)