设计模式【12】——代理模式(Proxy 模式)
前言
在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。至少在以下集中情况下可以采用 Proxy 模式解决问题: 1)创建开销大的对象时候,比如显示一幅大的图片,我们将这个创建的过程交给代理去完成,GoF 称之为虚代理(Virtual Proxy); 2)为网络上的对象创建一个局部的本地代理,比如要操作一个网络上的一个对象(网络性能不好的时候,问题尤其突出),我们将这个操纵的过程交给一个代理去完成,GoF 称之为远程代理(Remote Proxy); 3)对对象进行控制访问的时候,比如在 Jive 论坛中不同权限的用户(如管理员、普通用户等)将获得不同层次的操作权限,我们将这个工作交给一个代理去完成,GoF 称之为保护代理(Protection Proxy)。
一、代理模式(Proxy 模式)
Proxy模式的实现非常简单,本质上还是通过组合方式实现的。UML图如下:
二、具体源码
1.Proxy.h
代码如下(示例):
#ifndef _PROXY_H_ #define _PROXY_H_ #include <iostream> class Subject { public: virtual ~Subject(); //纯虚函数 virtual void Request() = 0; //构造函数设置为Protected,防止创建对象 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_
2.Proxy.cpp
代码如下(示例):
#include "Proxy.h" Subject::Subject() { } Subject::~Subject() { } ConcreteSubject::ConcreteSubject() { } ConcreteSubject::~ConcreteSubject() { } void ConcreteSubject::Request() { std::cout << "ConcreteSubject......request ...."<<std::endl; } Proxy::Proxy() { } Proxy::Proxy(Subject* sub) { _sub = sub; } Proxy::~Proxy() { delete _sub; } void Proxy::Request() { std::cout << "Proxy request...." << std::endl; _sub->Request(); }
3.main.cpp
代码如下(示例):
#include "Proxy.h" int main(int argc, char* argv[]) { Subject* sub = new ConcreteSubject(); Proxy* p = new Proxy(sub); p->Request(); return 0; }
三、运行结果
Proxy模式运行结果如下:
总结
Proxy模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用,能将客户端与目标对象分离,在一定程度上降低了系统的耦合度。Proxy模式实现了逻辑和实现的彻底解耦。但是在一定程度上,因为在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢,而且增加了系统的复杂度。