一、概述
?? ?代理模式是一種結構型模式,在很多不同的場合具有廣泛的分類和應用。其主要實現的思想是在客戶端和真正要訪問的對象之間引入一個
代理對象(間接層),于是,以往客戶端對真正對象的訪問現在變成了通過代理對象進行訪問,代理對象在這里起到了一個中介或者橋梁作用。
引入代理對象的目的主要是可以為客戶端增加額外的功能、約束或者針對客戶端的調用屏蔽一些復雜的細節問題。
二、基本概念與示例
?? ?代理模式的實質是通過引入一個代理類來為原始類(被代理類)增加額外的能力,這些額外的能力可能是指一些新功能、新服務,也可能
是一些約束或者限制等。那么現在試著考慮一個例子,通過瀏覽器訪問某個網站,最簡單的方式就是在瀏覽器中輸入網站的地址來直接訪問。
class CWebAddr
{
public:
?? ?virtual void visit() = 0;
?? ?virtual ~CWebAddr(){}
};
class CWebAddr_Shopping : public CWebAddr
{
public:
?? ?virtual void visit()
?? ?{
?? ??? ?//訪問購物網站復雜通信邏輯
?? ??? ?cout << "訪問CWebAddr_Shopping購物網站" << endl;
?? ?}
};
class CWebAddr_Video : public CWebAddr
{
public:
?? ?virtual void visit()
?? ?{
?? ??? ?//訪問視頻網站復雜通信邏輯
?? ??? ?cout << "訪問CWebAddr_Video視頻網站" << endl;
?? ?}
};
//主函數
int main()
{
?? ?CWebAddr *pShopping = new CWebAddr_Shopping();
?? ?pShopping->visit();
?? ?
?? ?CWebAddr *pVideo = new CWebAddr_Video();
?? ?pVideo->visit();
?? ?
?? ?delete pShopping;
?? ?delete pVideo;
?? ?
?? ?return 0;
}
上述代碼執行結果沒問題,描述主要是直接訪問某個或者某些網站,那么我們也可以引入代理類幫助我們訪問這些網站,
針對以上代碼做出調整:
class CWebAddrProxy : public CWebAddr
{
public:
?? ?CWebAddrProxy(CWebAddr* pWebAddr) : m_webAddr(pWebAddr){}
?? ?
public:
?? ?virtual void visit()
?? ?{?? ?
?? ??? ?m_webAddr->visit();
?? ?}
private:
?? ?CWebAddr* m_webAddr;?? ?
};
//主函數
int main()
{
?? ?CWebAddr *pShopping = new CWebAddr_Shopping();
?? ?CWebAddr *pVideo = new CWebAddr_Video();
?? ?
?? ?CWebAddrProxy *pWebproxy1 = new CWebAddrProxy(pShopping);
?? ?pWebproxy1->visit();
?? ?
?? ?CWebAddrProxy *pWebproxy2 = new CWebAddrProxy(pVideo);
?? ?pWebproxy2->visit();
?? ??? ?
?? ?delete pShopping;
?? ?delete pVideo;
?? ?delete pWebproxy1;
?? ?delete pWebproxy2;
?? ?
?? ?return 0;
}
三、代理模式定義與角色
?? ?引入代理模式的定義:為其他對象提供一種代理,以控制對這個對象的訪問。代理模式通過創建代理對象來代表真實對象,客戶端操作代理
對象與操作真實對象并沒有什么不同。當然,最核心、最本質的功能,最終還是需要代理對象操縱真實對象來完成。
代理模式UML圖中涉及三個角色:
(1)Subject(抽象對象)。該類定義真實主題與代理主題的共同接口,這樣,在真實主題的地方都可以使用代理主題。
(2)Proxy(代理主題)。該類內部包含了對真實主題的引用,從而可以對真實主題進行訪問。代理主題中一般會提供與真實主題相同的接口,以
達到可以取代真實主題的目的。同時也可以對真實主題的訪問進行約束和限制,也能夠控制必要時的創建/刪除真實主題。
(3)RealSubject(真實主題)定義代理主題代表的真實對象,真正的業務是在真實主題中實現的,客戶端通過代理主題間接訪問真實主題中的
接口。
四、代理模式的應用場合
?? ?代理模式UML圖分廠簡單,總結起來也簡單----在軟件設計中,增加間接層來獲取更大的靈活性和增加更多的控制。在實際中,代理模式可能
會在許多場合得到應用,并且其實現可能會非常復雜。
1)遠程代理
2)虛擬代理
3)保護代理
4)緩存/緩沖代理
5)智能引用代理
6)寫時復制優化代理