• 13 结构型模式-----代理模式


    模式动机(Proxy Pattern)引入一个代理对象负责对真实对象的访问。将代理对象和真实对象的公共接口提取出来,用Subject接口表示。具体结构图及其分析如下: 

    模式结构图:

     

     

    模式代码:

    bt_代理模式.h

     1 #ifndef PP_H
     2 #define PP_H
     3 #include <iostream>
     4 using namespace std;
     5 
     6 /*
     7     抽象主题类,定义了RealSubject和Proxy的公共接口,这样就可以在
     8     使用RealSubject的地方使用Proxy了
     9 */
    10 class Subject
    11 {
    12 public:
    13     virtual ~Subject(){ }
    14     virtual void Request() = 0;
    15 };
    16 
    17 /*
    18     具体主题类,表示Proxy所代表的实体类
    19 */
    20 class RealSubject : public Subject
    21 {
    22 public:
    23     virtual void Request()
    24     {
    25         std::cout << "Call RealSubject::Request()" << std::endl;
    26     }
    27 };
    28 
    29 /*
    30     代理类,保存一个引用指向RealSubject,使得可以控制实体的使用
    31 */
    32 class Proxy : public Subject
    33 {
    34 public:
    35     Proxy(){ realSubject = new RealSubject; }
    36 
    37     virtual void Request()
    38     {
    39         realSubject->Request();
    40     }
    41 
    42     ~Proxy(){ delete realSubject; }
    43 
    44 private:
    45     RealSubject* realSubject;
    46 };
    47 
    48 #endif // PP_H

    测试用例.cpp:

     1 #include "bt_代理模式.h"
     2 
     3 int main()
     4 {
     5     std::cout << "***** 代理模式测试 *****" << std::endl;
     6     Subject* pSub = new Proxy;
     7     pSub->Request();
     8 
     9     delete pSub;
    10 
    11     return 0;
    12 }
    
    

    模式分析:

    代理(Proxy)模式在访问真实对象时引入了一定程度的间接性。其中主要有如下几种类型:

    1》 远程代理(Remote Proxy)当访问一个位于不同地址空间的对象时,提供一个本地代理对象进行操作远程实体。

    2》 虚拟代理(virtual Proxy)当访问一个占用内存比较大的对象时,先创建一个比较小的代理实现对象预览功能,等到确实需要访问源对象时再创建真实对象的实体,这样可以达到资源的最优利用。如打开浏览器浏览图片时,显示的是小的代理对象,等到点击图片时,才创建真正的实体对象。

    3》 保护代理(Protection Proxy)根据不同的用户类型控制对实体对象的访问权限。

    4》 智能引用(Smart Reference)在被引用的实体对象上执行一些附加的事务处理等。

    5》 拷贝代理(copy-on-write)一般引用对象时只是简单地对引用计数加1,等到真正需要复制实体对象时(比如对象已被修改了),才执行深拷贝操作。

     

    代理模式降低了客户和实体对象之间的耦合性,但是由于增加了代理对象,无形中也会降低系统响应的速度,而且如果设计不当,将会增加系统的复杂性。

     

     

  • 相关阅读:
    年度回忆录(2012.102013.01)
    Java中的Annotation(1)三个基本Annotation
    Java7中的文件和目录管理Path类
    Struts1和Struts2核心控制器的执行原理
    java中的IO基础3
    动态代理(2)动态代理和AOP
    java中的IO基础
    《嫌疑犯x的献身》看完了。。。
    像NHibernate致敬ado.net entity framework的范型DAO和open session in view实现
    我的MBTI职业性格测试
  • 原文地址:https://www.cnblogs.com/benxintuzi/p/4556351.html
Copyright © 2020-2023  润新知