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


    一、意图

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

    二、基本思想

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

    三、优缺点分析

    GOOD:(适用场合)

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

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

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

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

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

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

    四、标准UML图

    clip_image002[4]

     

    五、标准源码

       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: }
  • 相关阅读:
    Docker Warning : the backing xfs filesystem is formatted without d_type support
    docker 版本变化及说明
    CORS 跨域请求
    nginx 用户登录认证
    PipelineDB On Kafka
    Postgres 主从配置(五)
    exec() has been disabled for security reasons
    invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"
    未连接到互联网
    github管理代码
  • 原文地址:https://www.cnblogs.com/steven_oyj/p/1745791.html
Copyright © 2020-2023  润新知