Proxy代理模式是一種“接口隔離”模式
- 在組件構建過程中,某些接口之間直接的依賴常常會帶來很多問題、甚至根本無法實現。採用一層間接(穩定)接口,來隔離本來互相緊密關聯的接口是一種常見的解決方案
動機
- 在面向對象系統中,有些對象由於某種原因(比如對象創建的開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問等),直接訪問會給使用者、或者系統結構帶來很多麻煩
- 如何在不失去透明操作對象的同時來管理/控制這些對象特有的複雜性?增加一層間接層是軟件開發中常見的解決方式
定義
- 爲其他對象提供一種代理以控制(隔離、使用接口)對這個對象的訪問
結構
代碼對比
未使用代理模式Client.cpp
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();
//....
}
};
Proxy.cpp
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();
//....
}
};
對比
- Proxy針對
RealSubject
實現了間接訪問,將其包裝起來,避免了直接調用Subject
- Proxy通常需要很多層面的配合,比較複雜
要點總結
- “增加一層間接層”是軟件系統中對許多複雜問題的一種常見解決方法。在面向對象的系統中,直接使用某些對象會帶來很多問題,作爲間接層的proxy對象便是解決這一問題的常用手段
- 具體proxy設計模式的實現方法、實現粒度都相差很大,有些可能對單個對象做細粒度的控制,如copy-on-write技術,有些可能對組件模塊提供抽象代理層,在架構蹭喫對對象做proxy
- Proxy並不一定要求保持接口完整的一致性,只要能夠實現間接控制,有時候損失一些透明性是可以接受的