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,等到真正需要复制实体对象时(比如对象已被修改了),才执行深拷贝操作。

 

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

 

 

原文地址:https://www.cnblogs.com/benxintuzi/p/4556351.html