标签:
模式动机(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,等到真正需要复制实体对象时(比如对象已被修改了),才执行深拷贝操作。
代理模式降低了客户和实体对象之间的耦合性,但是由于增加了代理对象,无形中也会降低系统响应的速度,而且如果设计不当,将会增加系统的复杂性。
标签:
原文地址:http://www.cnblogs.com/benxintuzi/p/4556351.html