博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

proxy 代理模式

Posted on 2014-09-19 17:53  bw_0927  阅读(210)  评论(0)    收藏  举报

http://www.cppblog.com/wolf/articles/124599.html

 

概念
代理这个词对我们来说非常熟悉,比如上网经常使用的代理服务器,还有销售代理商等。就是客户与目标之间的桥梁。
设计模式中的代理模式(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}