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