動機(Motivation)
- 在面向對象系統中,有些對象由於某種原因(比如對象創建的開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問等), 直接訪問會給使用者、或者系統結構帶來很多麻煩。
- 如何在不失去透明操作對象的同事來管理/控制這些對象特有的復雜性?增加一層間接層是軟件開發中常見的解決方式。
模式定義
為其他對象提供一種代理以控制(隔離,使用接口)對這對象的訪問。 ——《設計模式》GoF
結構(Structure)
要點總結
- Proxy並不一定要求保持接口完整的一致性,只要能夠實現間接控制,有時候損及一些透明性是可以接受的。
基本代碼
#include <iostream> using namespace std; class Subject // Subject類定義了RealSubject和Proxy的公用接口,這樣就在任何使用RealSubject的地方都可以用Proxy { public: virtual void Request() = 0; virtual ~Subject() {} }; class RealSubject : public Subject // RealSubject類,定義了Proxy所代表的真實實體 { public: void Request() { cout << "RealSubject" << endl; } }; class Proxy : public Subject // Proxy類,保存一個引用使得代理可以訪問實體,並提供一個與Subject的接口相同的接口,這樣代理就可以用來代替實體 { private: RealSubject* realSubject; public: void Request() { if (realSubject == NULL) realSubject = new RealSubject(); realSubject->Request(); } }; int main() { Proxy* p = new Proxy(); p->Request(); // RealSubject delete p; return 0; }
應用場合
- 遠程代理,也就是為了一個對象在不同的地址空間提供局部代表,這樣可以隱藏一個對象存在於不同地址空間的事實。
- 虛擬代理,是根據需要創建開銷很大的對象,通過它來存放實例化需要很長時間的真實對象。
- 安全代理,用來控制真是對象的訪問權限。一般用於對象應該有不同的訪問權限的時候。
- 智能指引,是指當調用真實的對象時,代理處理另外一些事。