代理模式
动机
在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等) ,直接访问会给使用者、或者系统结构带来很多麻烦。
如何在不失去透明操作对象的同时来管理/控制这些对象特有的复性?增加一层间接层是软件开发中常见的解决方式。
解决方法
为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问。
例子
class ISubject
{
public:
virtual void process();
};
class RealSubject: public ISubject
{
public:
virtual void process()
{
// ....
}
};
class ClientApp
{
ISubject *subject;
public:
ClientApp()
{
subject = new RealSubject();
}
void DoTask()
{
// ...
subject->process();
// ....
}
};
改进:
class ISubject
{
public:
virtual void process();
};
// Proxy的设计
class SubjectProxy: public ISubject
{
public:
virtual void process()
{
// 对RealSubject的一种间接访问
// ....
}
};
class ClientApp
{
ISubject *subject;
public:
ClientApp()
{
subject = new SubjectProxy();
}
void DoTask()
{
// ...
subject->process();
// ....
}
};
优缺点
优点:职责清晰。高扩展性。智能化。
缺点:由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。实现代理模式需要额外的工作,有些代理模式的实现非常复杂。因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多。同时,一旦接口增加方法,目标对象与代理对象都要维护。
编程思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法。