(结构型模式)Proxy——代理模式

时间:2022-10-01 07:26:09

一、意图

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

二、基本思想

     代理模式实际就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。

三、优缺点分析

GOOD:(适用场合)

远程代理:也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象在不同地址空间的事实。

                  例如:客户端程序调用代理就可以解决远程访问的问题

虚拟代理:是根据需要创建开销很大的对象,通过代理来存放实例化需要很长时间的真实对象,从而达到性能的最优化(例如浏览器使用代理模式来优化下载)

                  例如:打开大网页时,未马上打开的图片就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸。

安全代理:用来控制真实对象的访问权限

智能引用:当调用真实对象时,代理处理另外一些事

四、标准UML图

(结构型模式)Proxy——代理模式

 

五、标准源码

   1: #ifndef PROXY_H
   2: #define PROXY_H
   3:  
   4: // 定义了Proxy和RealSubject的公有接口,
   5: // 这样就可以在任何需要使用到RealSubject的地方都使用Proxy.
   6: class Subject
   7: {
   8: public:
   9:     Subject(){}
  10:     virtual ~Subject(){}
  11:  
  12:     virtual void Request() = 0;
  13: };
  14:  
  15: // 真正使用的实体
  16: class RealSubject
  17:     : public Subject
  18: {
  19: public:
  20:     RealSubject();
  21:     virtual ~RealSubject(){}
  22:  
  23:     virtual void Request();
  24: };
  25:  
  26: // 代理类,含有一个指向RealSubject对象的指针
  27: class Proxy
  28:     : public Subject
  29: {
  30: public:
  31:     Proxy();
  32:     virtual ~Proxy();
  33:  
  34:     virtual void Request();
  35:  
  36: private:
  37:     RealSubject* m_pRealSubject;
  38: };
  39: #endif

   1: #include "Proxy.h"
   2: #include <iostream>
   3:  
   4: RealSubject::RealSubject()
   5: {
   6:     std::cout << "Constructing a RealSubject\n";
   7: }
   8:  
   9: void RealSubject::Request()
  10: {
  11:     std::cout << "Request By RealSubject\n";
  12: }
  13:  
  14: Proxy::Proxy()
  15:     : m_pRealSubject(NULL)
  16: {
  17:     std::cout << "Constructing a Proxy\n";
  18: }
  19:  
  20: Proxy::~Proxy()
  21: {
  22:     delete m_pRealSubject;
  23:     m_pRealSubject = NULL;
  24: }
  25:  
  26: void Proxy::Request()
  27: {
  28:     // 需要使用RealSubject的时候才去初始化
  29:     if (NULL == m_pRealSubject)
  30:     {
  31:         std::cout << "Request By Proxy\n";
  32:         m_pRealSubject = new RealSubject();
  33:     }
  34:     m_pRealSubject->Request();
  35: }

   1: #include "Proxy.h"
   2: #include <stdlib.h>
   3:  
   4: int main()
   5: {
   6:     Subject* pProxy = new Proxy();
   7:     pProxy->Request();
   8:  
   9:     delete pProxy;
  10:  
  11:     system("pause");
  12:  
  13:     return 0;
  14: }