代理模式 Proxy
动机
在面向对象系统中,由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程额外的访问等),直接访问会给使用者,或者系统结构带来很多麻烦.
如何在不是去透明操作对象的同时来管理/控制这些对象特有的复杂性?增加一层间接曾是软件开发中常见的解决方式
模式定义
为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问
实例
朴素
客户端要去使用process 但是process周围需要做很多事情
class ISubject{
public:
virtual void process();
};
class RealSubject : public ISubject{
public:
virtual void process(){
//..
}
}
class ClientApp{
ISubject *subject;
public:
ClientApp(){
subject = new RealSubject();
}
ISubject *subject;
void DoTask(){
//... 可能是分布式原因 可能是安全原因等等 需要很多操作
subject -> process();
//... 同样需要很多操作
}
}
代理模式
class ISubject{
public:
virtual void process();
};
class RealSubject : public ISubject{
public:
virtual void process(){
//..自己写的类方法
}
}
class SubjectProxy : public ISubject{
private:
RealSubject realSubject;
public:
virtual void process(){
//对RealSubject的一种间接访问
//... 可能是分布式原因 可能是安全原因等等 需要很多操作
RealSubject->process();
//... 同样需要很多操作
}
}
//Proxy的设计
class ClientApp{
ISubject *subject;
public:
ClientApp(){
subject = new RealSubject();
}
ISubject *subject;
void DoTask(){
subject -> process();
}
}
结构
要点总结
- "增加一层间接层"是软件系统中对许多复杂问题的一种常见解决方法.在面向对象系统中,直接使用某些对象会带来很多问题,作为间接层的proxy对象便是这一问题的解决手段
- 具体proxy设计模式的实现方法,实现粒度都相差很大.有些可能对单个对象做细粒度的控制,如copy-on-write技术,有些可能对组件模块提供抽象代理曾,在架构层次对对象做proxy
- proxy并不一定要求保持接口完整的一致性,只要能够实现间接控制,有时候损及一些透明性是可以接受的.
笔记
- 能否仍然使用new一个对象然后访问方法地方式 继续访问远程对象?
- 透明操作:和原来new一个对象 然后访问一样简单 但是自己不需要关心内部细节
- 一般在分布式应用代理类及其频繁,如你访问别人的接口.你去访问那个接口 往往会生成一个那个接口的代理类 否则的话你得自己控制所有的访问细节
- 代理的核心思想是增加间接层 来实现不为外界所知的一些功能
- 字符串一般使用copy-on-write技术 当需要改对象的时候 需要在内部拷贝一份 就是用的代理
- 一个方法调用前的安全控制 或者是分布式系统调用前做的网络通信 等等代理都会频繁用到