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号
浙公网安备 33010602011771号