0 引言

0.1 目的

       本文档给出设计模式之——Proxy模式的简化诠释,并给出其C++实现

0.2 说明

Project

Design Pattern ExplanationBy K_Eckel

Authorization

Free Distributed but Ownership Reserved

Date

2005-04-05Cherry blossom is Beautiful

Test Bed

MS Visual C++ 6.0

0.3 参考

       在本文档的写作中,参考了以下的资源,在此列出表示感谢:

u       书籍

[GoF 2000]GoF,Design Patterns-Elements of Reusable Object-Oriented Software

Addison-Wesley 2000/9.

        [Martine 2003]Robert C.Martine, Agile Software Development Principles, Patterns, and Practices, Pearson Education, 2003.

0.4 联系作者

Author

K_Eckel

State

Candidate for Master’s Degree School of Computer Wuhan University

E_mail

frwei@whu.edu.cn  

2 Proxy模式

2.1 问题

至少在以下集中情况下可以用Proxy模式解决问题:

1)创建开销大的对象时候,比如显示一幅大的图片,我们将这个创建的过程交给代理去完成,GoF称之为虚代理(Virtual Proxy);

2)为网络上的对象创建一个局部的本地代理,比如要操作一个网络上的一个对象(网络性能不好的时候,问题尤其突出),我们将这个操纵的过程交给一个代理去完成,GoF称之为远程代理(Remote Proxy);

3)对对象进行控制访问的时候,比如在Jive论坛中不同权限的用户(如管理员、普通用户等)将获得不同层次的操作权限,我们将这个工作交给一个代理去完成,GoF称之为保护代理(Protection Proxy)。

4)智能指针(Smart Pointer),关于这个方面的内容,建议参看Andrew Koenig的《C++ 沉思录》中的第5

2.2 模式选择

       Proxy模式典型的结构图为:


2-1Proxy Pattern结构图

    实际上,Proxy模式的想法非常简单,

2.3 实现

2.3.1 完整代码示例(code

       Proxy模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用C++实现,并在VC 6.0下测试运行)。

代码片断1Proxy.h
//Proxy.h

#ifndef _PROXY_H_
#define _PROXY_H_

class Subject
{
public:
 virtual ~Subject();

 virtual void Request() = 0;

protected:
 Subject();

private:

};

class ConcreteSubject:public Subject
{
public:
 ConcreteSubject();

 ~ConcreteSubject();

 void Request();

protected:

private:

};

class Proxy
{
public:
 Proxy();

 Proxy(Subject* sub);

 ~Proxy();

 void Request();

protected:
 
private:
 Subject* _sub;
};

#endif //~_PROXY_H_

代码片断2Proxy.cpp
//Proxy.cpp

#include "Proxy.h"

#include <iostream>
using namespace std;

Subject::Subject()
{

}

Subject::~Subject()
{

}

ConcreteSubject::ConcreteSubject()
{

}

ConcreteSubject::~ConcreteSubject()
{

}

void ConcreteSubject::Request()
{
 cout<<"ConcreteSubject......request
...."<<endl;
}

Proxy::Proxy()
{

}

Proxy::Proxy(Subject* sub)
{
 _sub = sub;
}

Proxy::~Proxy()
{
 delete _sub;
}

void Proxy::Request()
{
 cout<<"Proxy request...."<<endl;

 _sub->Request();
}

代码片断3main.cpp
//main.cpp

#include "Proxy.h"

#include <iostream>
using namespace std;

int main(int argc,char* argv[])
{
 Subject* sub = new ConcreteSubject();

 Proxy* p = new Proxy(sub);

 p->Request();

 return 0;
}


2.3.2 代码说明

Proxy模式的实现很简单,这里不做多余解释。

可以看到,示例代码运行后,pRequest请求实际上是交给了sub来实际执行。

2.4 讨论

       Proxy模式最大的好处就是实现了逻辑和实现的彻底解耦。

Posted on 2005-07-08 20:52  k_eckel's mindview  阅读(956)  评论(1)    收藏  举报