一、引子
我們?nèi)タ萍际袌?chǎng)為自己的機(jī)器添加點(diǎn)奢侈的配件,很多DIYer都喜歡去找代理商,因?yàn)樵诖砩棠抢锬玫降臇|西不僅質(zhì)量有保證,而且價(jià)格和售后服務(wù)上都會(huì)好很多??蛻敉ㄟ^(guò)代理商得到了自己想要的東西,而且還享受到了代理商額外的服務(wù);而生產(chǎn)廠商通過(guò)代理商將自己的產(chǎn)品推廣出去,而且可以將一些銷售服務(wù)的任務(wù)交給代理商來(lái)完成(當(dāng)然代理商要和廠商來(lái)共同分擔(dān)風(fēng)險(xiǎn),分配利潤(rùn)),這樣自己就可以花更多的心思在產(chǎn)品的設(shè)計(jì)和生產(chǎn)上了。
在美國(guó),任何企業(yè)的產(chǎn)品要想拿到市場(chǎng)上去賣就必須經(jīng)過(guò)代理商這一個(gè)環(huán)節(jié),否則就是非法的。看來(lái)代理商在商業(yè)運(yùn)作中起著很關(guān)鍵的作用。 不小心把話題扯遠(yuǎn)了,回過(guò)頭來(lái),那么在我們的面向?qū)ο蟮某绦蛟O(shè)計(jì)中,會(huì)不會(huì)有代理商這樣的角色呢?來(lái)看這篇文章的人肯定不會(huì)說(shuō):沒(méi)有!
那么就跟著這篇文章來(lái)看看代理模式的奇妙吧。
二、定義和分類
代理模式在設(shè)計(jì)模式中的定義就是:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。說(shuō)白了就是,在一些情況下客戶不想或者不能直接引用一個(gè)對(duì)象,而代理對(duì)象可以在客戶和目標(biāo)對(duì)象之間起到中介作用,去掉客戶不能看到的內(nèi)容和服務(wù)或者增添客戶需要的額外服務(wù)。
那么什么時(shí)候要使用代理模式呢?在對(duì)已有的方法進(jìn)行使用的時(shí)候出現(xiàn)需要對(duì)原有方法進(jìn)行改進(jìn)或者修改,這時(shí)候有兩種改進(jìn)選擇:修改原有方法來(lái)適應(yīng)現(xiàn)在的使用方式,或者使用一個(gè)“第三者”方法來(lái)調(diào)用原有的方法并且對(duì)方法產(chǎn)生的結(jié)果進(jìn)行一定的控制。第一種方法是明顯違背了“對(duì)擴(kuò)展開(kāi)放、對(duì)修改關(guān)閉”(開(kāi)閉原則),而且在原來(lái)方法中作修改可能使得原來(lái)類的功能變得模糊和多元化(就像現(xiàn)在企業(yè)多元化一樣),而使用第二種方式可以將功能劃分的更加清晰,有助于后面的維護(hù)。所以在一定程度上第二種方式是一個(gè)比較好的選擇!
當(dāng)然,話又說(shuō)回來(lái)了,如果是一個(gè)很小的系統(tǒng),功能也不是很繁雜,那么使用代理模式可能就顯得臃腫,不如第一種方式來(lái)的快捷。這就像一個(gè)三口之家,家務(wù)活全由家庭主婦或者一個(gè)保姆來(lái)完成是比較合理的,根本不需要雇上好幾個(gè)保姆層層代理:)
根據(jù)《Java與模式》書(shū)中對(duì)代理模式的分類,代理模式分為8種,這里將幾種常見(jiàn)的、重要的列舉如下:
1. 遠(yuǎn)程(Remote)代理:為一個(gè)位于不同的地址空間的對(duì)象提供一個(gè)局域代表對(duì)象。比如:你可以將一個(gè)在世界某個(gè)角落一臺(tái)機(jī)器通過(guò)代理假象成你局域網(wǎng)中的一部分。
2. 虛擬(Virtual)代理:根據(jù)需要將一個(gè)資源消耗很大或者比較復(fù)雜的對(duì)象延遲的真正需要時(shí)才創(chuàng)建。比如:如果一個(gè)很大的圖片,需要花費(fèi)很長(zhǎng)時(shí)間才能顯示出來(lái),那么當(dāng)這個(gè)圖片包含在文檔中時(shí),使用編輯器或?yàn)g覽器打開(kāi)這個(gè)文檔,這個(gè)大圖片可能就影響了文檔的閱讀,這時(shí)需要做個(gè)圖片Proxy來(lái)代替真正的圖片。
3. 保護(hù)(Protect or Access)代理:控制對(duì)一個(gè)對(duì)象的訪問(wèn)權(quán)限。比如:在論壇中,不同的身份登陸,擁有的權(quán)限是不同的,使用代理模式可以控制權(quán)限(當(dāng)然,使用別的方式也可以實(shí)現(xiàn))。
4. 智能引用(Smart Reference)代理:提供比對(duì)目標(biāo)對(duì)象額外的服務(wù)。比如:紀(jì)錄訪問(wèn)的流量(這是個(gè)再簡(jiǎn)單不過(guò)的例子),提供一些友情提示等等。
代理模式是一種比較有用的模式,從幾個(gè)類的“小結(jié)構(gòu)”到龐大系統(tǒng)的“大結(jié)構(gòu)”都可以看到它的影子。
三、結(jié)構(gòu)
代理模式中的“代理商”要想實(shí)現(xiàn)代理任務(wù),就必須和被代理的“廠商”使用共同的接口(你可以想象為產(chǎn)品)。所以自然而然你會(huì)想到在java中使用一個(gè)抽象類或者接口(推薦)來(lái)實(shí)現(xiàn)這個(gè)共同的接口。于是代理模式就有三個(gè)角色組成了:
1.抽象主題角色:聲明了真實(shí)主題和代理主題的共同接口。
2.代理主題角色:內(nèi)部包含對(duì)真實(shí)主題的引用,并且提供和真實(shí)主題角色相同的接口。
3.真實(shí)主題角色:定義真實(shí)的對(duì)象。
使用類圖來(lái)表示下三者間的關(guān)系如下:
新聞熱點(diǎn)
疑難解答
圖片精選