代理模式
代理模式定义
代理模式,为其他对象提供一种代理以控制对这个对象的访问。
代理模式类图
以下是代理模式最简单的原理图:

图 01 代理模式类图
代理模式套用代码
1 #include <iostream> 2 using namespace std; 3 4 class Subject 5 { 6 public: 7 virtual void Request() = 0; 8 }; 9 10 class RealSubject : Subject 11 { 12 public: 13 virtual void Request() 14 { 15 cout << "请求真正处理的地方" << endl; 16 } 17 18 }; 19 20 class Proxy: Subject 21 { 22 private: 23 RealSubject* realSubject; 24 public: 25 Proxy() 26 { 27 realSubject = new RealSubject(); 28 } 29 virtual void Request() 30 { 31 if (realSubject == NULL) 32 { 33 realSubject = new RealSubject(); 34 } 35 realSubject->Request(); 36 } 37 }; 38 39 void main() 40 { 41 Proxy* proxy = new Proxy(); 42 proxy->Request(); 43 44 if(proxy != NULL) 45 { 46 delete proxy; 47 proxy = NULL; 48 } 49 }
代理模式应用
① 远程代理,就是为一个对象在不同过的地址空间提供局部代表。样可以隐藏一个对象存在于不同地址空间的事实。
② 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。这样就可以达到性能的最优化,比如说你打开一个很大的HTML网页时,里面可能有很多的 文字和图片,但你还是可以很快打开它,此时你所看到的是所有的文字,但图片却是一张一张地下载后才能看到。那些未打开的图片框,就是通过虚拟代理来替代了真实的图片,此时代理存储了真实图片的路径和尺寸。
③ 安全代理,用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候,智能指引,是批当调用真实的对象时。代理处理另外一些事。如计算真实对象的引用次数
总结:代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。
代理模式实例
本实例讲解的内容是追求者让代理者送女孩子礼物,类图如下:

图 02 代理模式实例类图
代理模式实例具体代码
1 #include "iostream" 2 using namespace std; 3 #include <string> 4 5 class CGiveGift 6 { 7 public: 8 virtual void GiveDolls() = 0; 9 virtual void GiveFlowers() = 0; 10 virtual void GiveChocolate() = 0; 11 }; 12 13 // 追求者类 14 class CPursuit : public CGiveGift 15 { 16 private: 17 string m_beautyName; 18 public: 19 CPursuit(string m_beautyName) 20 { 21 this->m_beautyName = m_beautyName; 22 } 23 24 virtual void GiveDolls() 25 { 26 cout << m_beautyName << "送你洋娃娃" << endl; 27 } 28 29 virtual void GiveFlowers() 30 { 31 cout << m_beautyName << "送你鲜花" << endl; 32 } 33 34 virtual void GiveChocolate() 35 { 36 cout << m_beautyName << "送你巧克力" << endl; 37 } 38 39 virtual ~CPursuit() 40 { 41 42 } 43 44 }; 45 46 // 代理者类 47 class CProxy : public CGiveGift 48 { 49 private: 50 CPursuit* gg; 51 public: 52 CProxy(string m_beautyName) 53 { 54 gg = new CPursuit(m_beautyName); 55 } 56 57 virtual void GiveDolls() 58 { 59 gg->GiveDolls(); 60 } 61 62 virtual void GiveFlowers() 63 { 64 gg->GiveFlowers(); 65 } 66 67 virtual void GiveChocolate() 68 { 69 gg->GiveChocolate(); 70 } 71 72 virtual ~CProxy() 73 { 74 if(gg != NULL) 75 { 76 delete gg; 77 } 78 79 } 80 }; 81 82 // 客户端 83 void main() 84 { 85 CProxy* proxy = new CProxy("jiaojiao"); 86 87 proxy->GiveDolls(); 88 proxy->GiveFlowers(); 89 proxy->GiveChocolate(); 90 91 delete proxy; 92 }
2014-11-26 17:03:06
浙公网安备 33010602011771号