代理对象我所理解的设计模式(C++实现)——代理模式(Proxy Pattern)
文章結(jié)束給大家來(lái)個(gè)程序員笑話:[M]
????
概述
????作為C++工程師,免不了要管理內(nèi)存,內(nèi)存管理也是C++中的難點(diǎn),而智能指針采用引用計(jì)數(shù)的方法很方便的幫我們管理了內(nèi)存的應(yīng)用,極大方便了我們的任務(wù)效率。而智能指針的這類用法其實(shí)就是代理模式的一種,他幫我們控制了該對(duì)象的內(nèi)存應(yīng)用。
????代理模式就是為其他對(duì)象提供一種代理來(lái)控制對(duì)這個(gè)對(duì)象的拜訪。
????
????
種類和用途
????Proxy模式根據(jù)種類不同,效果也不盡雷同:
????1、近程(Remote)代理:為一個(gè)位于不同的地址空間的對(duì)象提供一個(gè)局域代表對(duì)象。這個(gè)不同的地址空間可所以在本機(jī)器中,也可是在另一臺(tái)機(jī)器中。近程代理又叫做大使(Ambassador)。好處是系統(tǒng)可以將網(wǎng)絡(luò)的細(xì)節(jié)隱藏起來(lái),使得客戶端不必斟酌網(wǎng)絡(luò)的存在。客戶完全可以認(rèn)為被代理的對(duì)象是局域的而不是近程的,而代理對(duì)象承當(dāng)了大部份的網(wǎng)絡(luò)通訊任務(wù)。由于客戶可能沒有意識(shí)到會(huì)啟動(dòng)一個(gè)耗費(fèi)時(shí)間的近程調(diào)用,因此客戶沒有須要的思想準(zhǔn)備。
????2、虛擬(Virtual)代理:根據(jù)需要?jiǎng)?chuàng)立一個(gè)資源消耗較大的對(duì)象,使得此對(duì)象只在需要時(shí)才會(huì)被真正創(chuàng)立。應(yīng)用虛擬代理模式的好處就是代理對(duì)象可以在須要的時(shí)候才將被代理的對(duì)象加載;代理可以對(duì)加載的進(jìn)程加以須要的優(yōu)化。當(dāng)一個(gè)模塊的加載非常耗費(fèi)資源的情況下,虛擬代理的好處就非常顯著。
????3、Copy-on-Write代理:虛擬代理的一種。把復(fù)制(克隆)拖延到只有在客戶端需要時(shí),才真正采取行動(dòng)。
????4、保護(hù)(Protector Access)代理:控制對(duì)一個(gè)對(duì)象的拜訪,如果需要,可以給不同的用戶提供不同級(jí)別的應(yīng)用權(quán)限。保護(hù)代理的好處是它可以在運(yùn)行時(shí)間對(duì)用戶的有關(guān)權(quán)限進(jìn)行檢查,然后在核實(shí)后決定將調(diào)用傳遞給被代理的對(duì)象。
????5、Cache代理:為某一個(gè)目標(biāo)操作的結(jié)果提供臨時(shí)的存儲(chǔ)空間,以便多個(gè)客戶端可以共享這些結(jié)果。
????6、防火墻(Firewall)代理:保護(hù)目標(biāo),不讓惡意用戶親近。
????7、同步化(Synchronization)代理:使幾個(gè)用戶能夠同時(shí)應(yīng)用一個(gè)對(duì)象而沒有沖突。
????8、智能引用(SmartReference)代理:當(dāng)一個(gè)對(duì)象被引用時(shí),提供一些額外的操作,比如將對(duì)此對(duì)象調(diào)用的次數(shù)記錄下來(lái)等。
????在所有種類的代理模式中,虛擬(Virtual)代理、近程(Remote)代理、智能引用代理(SmartReference Proxy)和保護(hù)(Protector Access)代理是最為常見的代理模式。
?
????
類圖和實(shí)例
????
????
代理模式所涉及的角色有:
抽象主題角色(Subject):聲明白實(shí)在主題和代理主題的共同接口,這樣一來(lái)在任何應(yīng)用實(shí)在主題的地方都可以應(yīng)用代理主題。
代理主題(Proxy)角色:代理主題角色內(nèi)部含有對(duì)真是主題的引用,從而可以在任何時(shí)候操作實(shí)在主題對(duì)象;代理主題角色提供一個(gè)與實(shí)在主題角色雷同的接口,以便可以在任何時(shí)候都可以替換實(shí)在主體;控制實(shí)在主題的應(yīng)用,擔(dān)任在需要的時(shí)候創(chuàng)立實(shí)在主題對(duì)象(和刪除實(shí)在主題對(duì)象);代理角色通常在將客戶端調(diào)用傳遞給實(shí)在的主題之前或以后,都要執(zhí)行某個(gè)操作,而不是單純的將調(diào)用傳遞給實(shí)在主題對(duì)象。
實(shí)在主題角色(RealSubject)角色:定義了代理角色所代表的實(shí)在對(duì)象。
????這里給出一個(gè)C++中智能指針的例子,自己代碼從新實(shí)現(xiàn)了下:
每日一道理天又快黑了,這座忙碌的城市又將入睡,讓這勞累的“身軀”暫別白日的辛勤,讓它入睡,陪伴著城市中的人們進(jìn)入夢(mèng)鄉(xiāng)。當(dāng)空的彎月正深情地注視著這座城市與城市中的人們,看著家家戶戶的燈漸漸熄滅,它在床頭悄悄奏響“明月曲”……
// TestProxy.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include <assert.h>#define KSAFE_DELETE(p) \if (p) \{ \delete p; \p = NULL; \}class KRefCount { public:KRefCount():m_nCount(0){}public:void AddRef(){m_nCount++;}int Release(){return --m_nCount;}void Reset(){m_nCount=0;}private:int m_nCount; };template <typename T> class KSmartPtr { public:KSmartPtr(void): m_pData(NULL){m_pReference = new KRefCount();m_pReference->AddRef();}KSmartPtr(T* pValue): m_pData(pValue){m_pReference = new KRefCount();m_pReference->AddRef();}KSmartPtr(const KSmartPtr<T>& sp): m_pData(sp.m_pData), m_pReference(sp.m_pReference){m_pReference->AddRef();}~KSmartPtr(void){if (m_pReference && m_pReference->Release() == 0){KSAFE_DELETE(m_pData);KSAFE_DELETE(m_pReference);}}inline T& operator*(){return *m_pData;}inline T* operator->(){return m_pData;}KSmartPtr<T>& operator=(const KSmartPtr<T>& sp){if (this != &sp){if (m_pReference && m_pReference->Release() == 0){KSAFE_DELETE(m_pData);KSAFE_DELETE(m_pReference);}m_pData = sp.m_pData;m_pReference = sp.m_pReference;m_pReference->AddRef();}return *this;}KSmartPtr<T>& operator=(T* pValue){if (m_pReference && m_pReference->Release() == 0){KSAFE_DELETE(m_pData);KSAFE_DELETE(m_pReference);}m_pData = pValue;m_pReference = new KRefCount;m_pReference->AddRef();return *this;}T* Get(){T* ptr = NULL; ptr = m_pData;return ptr;}void Attach(T* pObject){if (m_pReference->Release() == 0){KSAFE_DELETE(m_pData);KSAFE_DELETE(m_pReference);}m_pData = pObject;m_pReference = new KRefCount;m_pReference->AddRef();}T* Detach(){T* ptr = NULL;if (m_pData){ ptr = m_pData;m_pData = NULL;m_pReference->Reset();}return ptr;}private:KRefCount* m_pReference;T* m_pData; };
????
與其他模式的區(qū)分
????1)適配器模式Adapter
????適配器Adapter為它所適配的對(duì)象提供了一個(gè)不同的接口。相反,代理提供了與它的實(shí)體雷同的接口。然而,用于拜訪保護(hù)的代理可能會(huì)拒絕執(zhí)行實(shí)領(lǐng)會(huì)執(zhí)行的操作,因此,它的接口實(shí)際上可能只是實(shí)體接口的一個(gè)子集。
????2) 裝飾器模式Decorator
????盡管Decorator的實(shí)現(xiàn)部分與代理相似,但Decorator的目的不一樣。Decorator為對(duì)象添加一個(gè)或多個(gè)功能,而代理則控制對(duì)對(duì)象的拜訪。?
????
總結(jié)
????在軟件系統(tǒng)中,加一個(gè)中間層是我們常用的解決方法,這方面Proxy模式給了我們很好的實(shí)現(xiàn)。
????
????LCL_data原創(chuàng)于CSDN.NET【http://blog.csdn.net/lcl_data/article/details/8989420】
文章結(jié)束給大家分享下程序員的一些笑話語(yǔ)錄: 騰訊的動(dòng)作好快,2010年3月5日19時(shí)28分58秒,QQ同時(shí)在線人數(shù)1億!剛剛看到編輯發(fā)布的文章,相差才2分鐘,然后連專題頁(yè)面都做出來(lái)了,他們?cè)缇皖A(yù)料到了吧?(其實(shí),每人贈(zèng)送10Q幣,輕輕松松上兩億!)
--------------------------------- 原創(chuàng)文章 By
代理和對(duì)象
---------------------------------
轉(zhuǎn)載于:https://www.cnblogs.com/xinyuyuanm/archive/2013/05/29/3106808.html
總結(jié)
以上是生活随笔為你收集整理的代理对象我所理解的设计模式(C++实现)——代理模式(Proxy Pattern)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新冠后遗症不容小觑!《柳叶刀》:超1/8
- 下一篇: Linux下mysql整库备份