Mike's blog

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  0 Posts :: 23 Stories :: 83 Comments :: 0 Trackbacks

常用链接

留言簿(17)

我参与的团队

搜索

  •  

最新评论

概念
代理这个词对我们来说非常熟悉,比如上网经常使用的代理服务器,还有销售代理商等。就是客户与目标之间的桥梁。
设计模式中的代理模式(Proxy)是这样定义的:为其他对象提供一种代理以控制对这个对象的访问。
若要为其他对象提供代理服务,那么首先本身也要具有与被代理对象同样的方法,那么这样在访问时才能真正起到(透明)代理的作用。
所以代理类一般同被代理类是继承于同一个类的兄弟类,区别就是他是为别人服务的。

这样说来,表面看代理很风光,啥都得通过他,好像没他不行似的,其实他就是个跑堂的!


组成部分

1.抽象主题:基类,声明了代理对象和真实对象的共同点;
2.真实主题:真正需要被调用的对象;
3.代理对象:代理真实对象的对象。


分类
1.远程代理:也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。这个不同的地址空间可以是在本机器上,也可以在另一台机器中。
2.虚拟代理:是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,使其只有在真正需要时才被创建。
3.安全代理:也叫保护代理,用来控制真实对象访问时的权限,如果有必要的话,可以给不同调用者提供不同的权限。
4.智能指引:是指当调用真实对象时,代理处理另外一些事,比如记录对此对象的调用次数等。
5.写时拷贝:虚拟代理的一种,把复制推迟到只有客户的需要时才进行。
6.缓存代理:为某一个目标的操作结果提供临时存储空间,以便其他客户的可以共享访问,有点缓存的味道。
7.防火墙代理:保护对象,不让用户访问,安全代理的特例。
8.同步代理:可以让几个用户同时访问同一个对象而不产生冲突。
常用的是前四种代理方式。

UML类图
 

实例代码
1)Proxy.h

 1#ifndef _PROXY_H
 2#define _PROXY_H
 3
 4///@brief Abstract Base Class.
 5class Subject 
 6{
 7public:
 8    Subject() {}
 9    virtual ~Subject() {}
10    virtual void request() = 0;
11}
;
12
13///@brief Real entity class.
14class RealSubject: public Subject 
15{
16public:
17    RealSubject();
18    virtual ~RealSubject();
19    virtual void request();
20}
;
21
22///@brief Proxy class, including a pointer of pointing to the Real-entity class. 
23class Proxy: public Subject 
24{
25public:
26    Proxy();
27    virtual ~Proxy();
28    virtual void request();
29
30private:
31    RealSubject* m_realSubject;
32}
;
33
34#endif

2)Proxy.cpp
 1#include "Proxy.h"
 2#include <iostream>
 3
 4using namespace std;
 5
 6RealSubject::RealSubject()
 7{
 8    cout << "RealSubject constructor" << endl;
 9}

10
11RealSubject::~RealSubject()
12{
13    cout << "RealSubject destructor" << endl;
14}

15
16///@brief Real-entity's request method.
17void RealSubject::request()
18{
19    cout << "RealSubject request" << endl;
20}

21
22Proxy::Proxy(): m_realSubject(NULL)
23{
24    cout << "Proxy constructor" << endl;
25}

26
27Proxy::~Proxy()
28{
29    cout << "Proxy destructor" << endl;
30    delete m_realSubject;
31    m_realSubject = NULL;
32}

33
34///@brief Proxy's request method.
35void Proxy::request()
36{
37    cout << "Proxy request" << endl;
38
39    ///@brief Construct it when necessary.
40    if (!m_realSubject) {
41        m_realSubject = new RealSubject();
42    }

43
44    m_realSubject->request();
45}

3)Main.cpp
 1#include "Proxy.h"
 2#include <iostream>
 3
 4using namespace std;
 5
 6int main()
 7{
 8    Subject* proxy = new Proxy();
 9    proxy->request();
10
11    delete proxy;
12    proxy = NULL;
13
14    return 0;
15}

posted on 2010-08-25 00:37 老狼 阅读(1431) 评论(0)  编辑 收藏 引用 所属分类: C/C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理