Proxy
動機
- 在面向對象系統中,有些對象由於某種原因(比如對象創建的開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問等), 直接訪問會給使用者、或者系統結構帶來很多麻煩。
- 如何在不失去透明操作對象的同事來管理/控制這些對象特有的複雜性?增加一層間接層是軟件開發中常見的解決方式。
模式定義
爲其他對象提供一種代理以控制(隔離,使用接口)對這對象的訪問。 ——《設計模式》GoF
(就比如明星跟經紀人的關係,你要安排商演,必須經過經紀人的同意。)
要點總結
- “增加一層間接層”是軟件系統中對許多複雜問題的一種常見解決方法。直接使用某些對象會帶來很大問題,做爲間接層的Proxy對象是解決這一問題的常用手段。
- Proxy並不一定要求保持接口完整的一致性,只要能夠實現間接控制,有時候損及一些透明性是可以接受的。
- Decorator、Facade、Proxy、Adapter都可以說是給對象添加一層包裝,但目的不一樣(Proxy在一些分佈式的webServer中最常用,客戶端想訪問server時可以用工具在生成一個Proxy與server進行通訊)
Demo
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();
//....
}
};