代理模式

代理模式定义

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

代理模式类图

以下是代理模式最简单的原理图:

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

posted on 2014-11-26 17:00  xiaoheike  阅读(403)  评论(0)    收藏  举报

导航