淺析設(shè)計(jì)模式中的代理模式在C++編程中的運(yùn)用
由遇到的問題引出代理模式
至少在以下集中情況下可以用代理模式解決問題:
- 創(chuàng)建開銷大的對(duì)象時(shí)候,比如顯示一幅大的圖片,我們將這個(gè)創(chuàng)建的過程交給代理去完成,GoF 稱之為虛代理(Virtual Proxy);
- 為網(wǎng)絡(luò)上的對(duì)象創(chuàng)建一個(gè)局部的本地代理,比如要操作一個(gè)網(wǎng)絡(luò)上的一個(gè)對(duì)象(網(wǎng)絡(luò)性能不好的時(shí)候,問題尤其突出),我們將這個(gè)操縱的過程交給一個(gè)代理去完成,GoF 稱之為遠(yuǎn)程代理(Remote Proxy);
- 對(duì)對(duì)象進(jìn)行控制訪問的時(shí)候,比如在 Jive 論壇中不同權(quán)限的用戶(如管理員、普通用戶等)將獲得不同層次的操作權(quán)限,我們將這個(gè)工作交給一個(gè)代理去完成,GoF 稱之為保護(hù)代理(Protection Proxy)。
UML 圖:

角色:
- Subject: 抽象角色。聲明真實(shí)對(duì)象和代理對(duì)象的共同接口。
- Proxy: 代理角色。代理對(duì)象與真實(shí)對(duì)象實(shí)現(xiàn)相同的接口,所以它能夠在任何時(shí)刻都能夠代理真實(shí)對(duì)象。代理角色內(nèi)部包含有對(duì)真實(shí)對(duì)象的引用,所以她可以操作真實(shí)對(duì)象,同時(shí)也可以附加其他的操作,相當(dāng)于對(duì)真實(shí)對(duì)象進(jìn)行封裝。
- RealSubject: 真實(shí)角色。它代表著真實(shí)對(duì)象,是我們最終要引用的對(duì)象
舉例:
假若你有一個(gè)工廠開始是生產(chǎn)手機(jī)的,但是它現(xiàn)在不想自己生產(chǎn)了,它把自己的東西交給了一家代工廠富士康去生產(chǎn),那么便有了下面的代碼去構(gòu)建。
統(tǒng)一的抽象接口 IFactory
class IFactory
{
public:
IFactory(){}
virtual void makeProduct() = 0;
};
你的手機(jī)工廠
class PhoneFactory : IFactory
{
public:
PhoneFactory(){}
void makeProduct()
{
cout<<"生產(chǎn)手機(jī)"<<endl;
}
};
專門做代工的代理工廠富士康
class FoxconnProxy : IFactory
{
public:
FoxconnProxy(IFactory* factory)
{
m_real = factory;
}
void makeProduct()
{
m_real->makeProduct();
}
private:
IFactory* m_real;
};
客戶端:
IFactory* factory = new PhoneFactory(); FoxconnProxy* proxy = new FoxconnProxy(factory); proxy->makeProduct();
看了uml圖和上面的代碼你會(huì)可能會(huì)發(fā)現(xiàn),先訪問代理類再訪問真正要訪問的對(duì)象。似乎這樣有點(diǎn)多此一舉的味道,其實(shí)不然。代理類可以在真正的類執(zhí)行之前,進(jìn)行預(yù)處理。 比富士康生產(chǎn)的手機(jī)之前可能會(huì)堅(jiān)持元器件是否合格,不合格就不生產(chǎn)等。在比如你有一個(gè)系統(tǒng)實(shí)現(xiàn)了登陸功能,在用戶登錄時(shí), 真正的登錄類和代理登錄類都實(shí)現(xiàn)了Login接口, 不同的是Proxy類的方法中增加了用戶是否合法的判斷, 只有合法時(shí)才去調(diào)用真正登錄類的login方法. 用戶訪問的其實(shí)是Proxy的login方法.這都是代理模式的優(yōu)點(diǎn)。而且采用代理模式的話,并且你可以隨時(shí)更改代理。還有一點(diǎn)你會(huì)發(fā)現(xiàn),真正對(duì)象與代理他們實(shí)現(xiàn)同一個(gè)接口。
這個(gè)模式和裝飾者模式有點(diǎn)類似之處,都是包裝,但是請(qǐng)注意他們應(yīng)用場(chǎng)景不一樣:一個(gè)是動(dòng)態(tài)的給類添加職責(zé),一個(gè)是控制對(duì)這個(gè)對(duì)象的訪問。最重要的一點(diǎn)不同是他們的結(jié)構(gòu)不同,你對(duì)比下兩個(gè)模式的uml圖便知。
相關(guān)文章
C語言實(shí)現(xiàn)訪問及查詢MySQL數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了C語言實(shí)現(xiàn)訪問及查詢MySQL數(shù)據(jù)庫(kù)的方法,涉及C語言基于libmysql.lib實(shí)現(xiàn)訪問MySQL數(shù)據(jù)庫(kù)的相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
c語言鏈表基本操作(帶有創(chuàng)建鏈表 刪除 打印 插入)
這篇文章主要介紹了c語言鏈表基本操作,大家參考使用吧2013-12-12
C++實(shí)現(xiàn)簡(jiǎn)單FTP客戶端軟件開發(fā)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單FTP客戶端軟件開發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
c語言網(wǎng)絡(luò)編程-標(biāo)準(zhǔn)步驟(改進(jìn)版)
這篇文章主要介紹了c語言網(wǎng)絡(luò)編程-標(biāo)準(zhǔn)步驟的改進(jìn)說明,需要的朋友可以參考下2014-01-01
C語言SetConsoleCursorInfo函數(shù)使用方法
這篇文章介紹了C語言SetConsoleCursorInfo函數(shù)的使用方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12

