0 引言
0.1 目的
本文档给出设计模式之——Proxy模式的简化诠释,并给出其C++实现。
0.2 说明
|
Project |
Design Pattern Explanation(By K_Eckel) |
|
Authorization |
Free Distributed but Ownership Reserved |
|
Date |
|
|
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 |
|
E_mail |
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-1:Proxy Pattern结构图
实际上,Proxy模式的想法非常简单,
2.3 实现
2.3.1 完整代码示例(code)
Proxy模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用C++实现,并在VC 6.0下测试运行)。
|
代码片断1:Proxy.h #ifndef _PROXY_H_ class Subject virtual void Request() = 0; protected: private: }; class ConcreteSubject:public Subject ~ConcreteSubject(); void Request(); protected: private: }; class Proxy Proxy(Subject* sub); ~Proxy(); void Request(); protected: #endif //~_PROXY_H_ |
|
代码片断2:Proxy.cpp #include "Proxy.h" #include <iostream> Subject::Subject() } Subject::~Subject() } ConcreteSubject::ConcreteSubject() } ConcreteSubject::~ConcreteSubject() } void ConcreteSubject::Request() Proxy::Proxy() } Proxy::Proxy(Subject* sub) Proxy::~Proxy() void Proxy::Request() _sub->Request(); |
|
代码片断3:main.cpp #include "Proxy.h" #include <iostream> int main(int argc,char* argv[]) Proxy* p = new Proxy(sub); p->Request(); return 0; |
2.3.2 代码说明
Proxy模式的实现很简单,这里不做多余解释。
可以看到,示例代码运行后,p的Request请求实际上是交给了sub来实际执行。
2.4 讨论
Proxy模式最大的好处就是实现了逻辑和实现的彻底解耦。
浙公网安备 33010602011771号