Proxy代理模式
動機(Motivation)
- 在面向對象系統中,有些對象由於某種原因(比如對象創建的開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問等), 直接訪問會給使用者、或者系統結構帶來很多麻煩。
- 如何在不失去透明操作對象的同時來管理/控制這些對象特有的複雜性?增加一層間接層是軟件開發中常見的解決方式。
模式定義
- 爲其他對象提供一種代理以控制(隔離,使用接口)對這對象的訪問。
舉個例子
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();
};
class SubjectProxy: public ISubject{
public:
virtual void process(){
對RealSubject的一種間接訪問
可以做一些相應的操作
}
};
class ClientApp{
ISubject* subject;
public:
ClientApp(){
subject=new SubjectProxy();
}
void DoTask(){
subject->process();
}
};
結構(Structure)
要點總結
- “增加一層間接層”是軟件系統中對許多複雜問題的一種常見解決方案。在面向對象系統中,直接使用某些對象會帶來很多問題,作爲間接層的Proxy對象便是解決這一問題的常用手段。
- 具體Proxy設計模式的實現方法、實現粒度都相差很大,有些可能對單個對象做細粒度的控制,如copy-on-write技術,有些可能對組建模塊提供抽象代理層,在架構層次對對象做proxy
- Proxy並不一定要求保持接口完整的一致性,只要能夠實現間接控制,有時候損及一些透明性是可以接受的。