



全文預(yù)覽已結(jié)束
下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
深入淺出基于Java的代理設(shè)計(jì)模式 2005-03-09 08:52作者:ai92出處:blog責(zé)任編輯:方舟一、引子 我們?nèi)タ萍际袌?chǎng)為自己的機(jī)器添加點(diǎn)奢侈的配件,很多DIYer都喜歡去找代理商,因?yàn)樵诖砩棠抢锬玫降臇|西不僅質(zhì)量有保證,而且價(jià)格和售后服務(wù)上都會(huì)好很多??蛻?hù)通過(guò)代理商得到了自己想要的東西,而且還享受到了代理商額外的服務(wù);而生產(chǎn)廠商通過(guò)代理商將自己的產(chǎn)品推廣出去,而且可以將一些銷(xiāo)售服務(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)上去賣(mài)就必須經(jīng)過(guò)代理商這一個(gè)環(huán)節(jié),否則就是非法的??磥?lái)代理商在商業(yè)運(yùn)作中起著很關(guān)鍵的作用。 不小心把話(huà)題扯遠(yuǎn)了,回過(guò)頭來(lái),那么在我們的面向?qū)ο蟮某绦蛟O(shè)計(jì)中,會(huì)不會(huì)有代理商這樣的角色呢?來(lái)看這篇文章的人肯定不會(huì)說(shuō):沒(méi)有!那么就跟著這篇文章來(lái)看看代理模式的奇妙吧。二、定義和分類(lèi)代理模式在設(shè)計(jì)模式中的定義就是:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪(fǎng)問(wèn)。說(shuō)白了就是,在一些情況下客戶(hù)不想或者不能直接引用一個(gè)對(duì)象,而代理對(duì)象可以在客戶(hù)和目標(biāo)對(duì)象之間起到中介作用,去掉客戶(hù)不能看到的內(nèi)容和服務(wù)或者增添客戶(hù)需要的額外服務(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)類(lèi)的功能變得模糊和多元化(就像現(xiàn)在企業(yè)多元化一樣),而使用第二種方式可以將功能劃分的更加清晰,有助于后面的維護(hù)。所以在一定程度上第二種方式是一個(gè)比較好的選擇!當(dāng)然,話(huà)又說(shuō)回來(lái)了,如果是一個(gè)很小的系統(tǒng),功能也不是很繁雜,那么使用代理模式可能就顯得臃腫,不如第一種方式來(lái)的快捷。這就像一個(gè)三口之家,家務(wù)活全由家庭主婦或者一個(gè)保姆來(lái)完成是比較合理的,根本不需要雇上好幾個(gè)保姆層層代理:)根據(jù)Java與模式書(shū)中對(duì)代理模式的分類(lèi),代理模式分為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ì)象的訪(fǎng)問(wèn)權(quán)限。比如:在論壇中,不同的身份登陸,擁有的權(quán)限是不同的,使用代理模式可以控制權(quán)限(當(dāng)然,使用別的方式也可以實(shí)現(xiàn))。4. 智能引用(Smart Reference)代理:提供比對(duì)目標(biāo)對(duì)象額外的服務(wù)。比如:紀(jì)錄訪(fǎng)問(wèn)的流量(這是個(gè)再簡(jiǎn)單不過(guò)的例子),提供一些友情提示等等。 代理模式是一種比較有用的模式,從幾個(gè)類(lèi)的“小結(jié)構(gòu)”到龐大系統(tǒng)的“大結(jié)構(gòu)”都可以看到它的影子。三、結(jié)構(gòu)代理模式中的“代理商”要想實(shí)現(xiàn)代理任務(wù),就必須和被代理的“廠商”使用共同的接口(你可以想象為產(chǎn)品)。所以自然而然你會(huì)想到在java中使用一個(gè)抽象類(lèi)或者接口(推薦)來(lái)實(shí)現(xiàn)這個(gè)共同的接口。于是代理模式就有三個(gè)角色組成了:1抽象主題角色:聲明了真實(shí)主題和代理主題的共同接口。2代理主題角色:內(nèi)部包含對(duì)真實(shí)主題的引用,并且提供和真實(shí)主題角色相同的接口。3真實(shí)主題角色:定義真實(shí)的對(duì)象。使用類(lèi)圖來(lái)表示下三者間的關(guān)系如下:當(dāng)然,圖上所示的是代理模式中的一個(gè)具體情況。而代理模式可以非常靈活的使用其他方式來(lái)實(shí)現(xiàn),這樣就與圖上所示有很大的區(qū)別。也許,現(xiàn)在你已經(jīng)對(duì)代理模式已經(jīng)有了一個(gè)宏觀的認(rèn)識(shí)了,下面我們來(lái)看看怎么實(shí)際的使用代理模式。四、舉例以論壇中已注冊(cè)用戶(hù)和游客的權(quán)限不同來(lái)作為第一個(gè)例子:已注冊(cè)的用戶(hù)擁有發(fā)帖,修改自己的注冊(cè)信息,修改自己的帖子等功能;而游客只能看到別人發(fā)的帖子,沒(méi)有其他權(quán)限。為了簡(jiǎn)化代碼,更好的顯示出代理模式的骨架,我們這里只實(shí)現(xiàn)發(fā)帖權(quán)限的控制。 首先我們先實(shí)現(xiàn)一個(gè)抽象主題角色MyForum,里面定義了真實(shí)主題和代理主題的共同接口發(fā)帖功能。代碼如下:public interface MyForumpublic void AddFile();這樣,真實(shí)主題角色和代理主題角色都要實(shí)現(xiàn)這個(gè)接口。其中真實(shí)的主題角色基本就是將這個(gè)接口的方法內(nèi)容填充進(jìn)來(lái)。所以在這里就不再贅述它的實(shí)現(xiàn)。我們把主要的精力放到關(guān)鍵的代理主題角色上。代理主題角色代碼大體如下:public class MyForumProxy implements MyForum private RealMyForum forum ;private int permission ; /權(quán)限值public MyForumProxy(int permission)forum = new RealMyForum() this.permission = permission ;/實(shí)現(xiàn)的接口public void AddFile()/滿(mǎn)足權(quán)限設(shè)置的時(shí)候才能夠執(zhí)行操作/Constants是一個(gè)常量類(lèi)if(Constants.ASSOCIATOR = permission)forum.AddFile();else System.out.println(You are not a associator of MyForum ,please registe!);這樣就實(shí)現(xiàn)了代理模式的功能。當(dāng)然你也可以在這個(gè)代理類(lèi)上添加自己的方法來(lái)實(shí)現(xiàn)額外的服務(wù),比如統(tǒng)計(jì)帖子的瀏覽次數(shù),記錄用戶(hù)的登錄情況等等。還有一個(gè)很常見(jiàn)的代理模式的使用例子就是對(duì)大幅圖片瀏覽的控制。在我們常見(jiàn)的網(wǎng)站上面瀏覽圖文的信息時(shí),不知道你有沒(méi)有注意到,圖片位置放置的是經(jīng)過(guò)縮小的,當(dāng)有人要仔細(xì)的查看這個(gè)圖片時(shí),可以通過(guò)點(diǎn)擊圖片來(lái)激活一個(gè)鏈接,在一個(gè)新的網(wǎng)頁(yè)打開(kāi)要看的圖片 。這樣對(duì)于提高瀏覽速度是很有好處的,因?yàn)椴皇敲總€(gè)人都要去看仔細(xì)圖上的信息。這種情況就可以使用代理模式來(lái)全面實(shí)現(xiàn)。這里我將思路表述出來(lái),至于實(shí)現(xiàn)由于工作原因,就不表述了,至于這種方式在B/S模式下的真實(shí)可行性,我沒(méi)有確認(rèn)過(guò),只是憑空的想象。如果不是可行的方式,那這個(gè)例子可以放到一個(gè)C/S下來(lái)實(shí)現(xiàn),這個(gè)是絕對(duì)沒(méi)有問(wèn)題的,而且在很多介紹設(shè)計(jì)模式的書(shū)和文章中使用。兩種方式的實(shí)現(xiàn)有興趣的可以來(lái)嘗試一下。我們?cè)跒g覽器中訪(fǎng)問(wèn)網(wǎng)頁(yè)時(shí)是調(diào)用的不是真實(shí)的裝載圖片的方法,而是在代理對(duì)象中的方法,在這個(gè)對(duì)象中,先使用一個(gè)線(xiàn)程向?yàn)g覽器裝載了一個(gè)縮小版的圖片,而在后臺(tái)使用另一個(gè)線(xiàn)程來(lái)調(diào)用真實(shí)的裝載大圖片的方法將圖片加載到本地,當(dāng)你要瀏覽這個(gè)圖片的時(shí)候,將其在新的網(wǎng)頁(yè)中顯示出來(lái)。當(dāng)然如果在你想瀏覽的時(shí)候圖片尚未加載成功,可以再啟動(dòng)一個(gè)線(xiàn)程來(lái)顯示
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東中職考試題庫(kù)及答案
- 右三踝骨折護(hù)理查房
- 自發(fā)性氣胸的護(hù)理措施
- 4S店車(chē)間生產(chǎn)安全培訓(xùn)
- 銀行員工之聲培訓(xùn)課件
- 腫瘤護(hù)理發(fā)展趨勢(shì)
- 養(yǎng)老機(jī)構(gòu)安全培訓(xùn)
- 中班語(yǔ)言彩色奶牛課件
- 圖形認(rèn)知培訓(xùn)課件
- 鉆孔灌注樁培訓(xùn)課件
- 【語(yǔ)文】西安外國(guó)語(yǔ)大學(xué)附屬小學(xué)(雁塔區(qū))小學(xué)五年級(jí)下冊(cè)期末試卷(含答案)
- 新編旅游職業(yè)道德 課件 譚為躍 第3-5章 旅行社從業(yè)人員道德素養(yǎng)、酒店從業(yè)者道德素養(yǎng)、景區(qū)點(diǎn)從業(yè)人員道德素養(yǎng)
- 市政管道施工培訓(xùn)課件
- 小學(xué)數(shù)學(xué)“組題”設(shè)計(jì)分析 論文
- 附件16:地下室燈帶臨時(shí)照明系統(tǒng)方案
- 中央空調(diào)維護(hù)保養(yǎng)服務(wù)投標(biāo)方案(技術(shù)標(biāo))
- 服務(wù)認(rèn)證培訓(xùn)課件
- 風(fēng)電場(chǎng)反事故措施
- 細(xì)胞生物學(xué)與疾病預(yù)防與治療
- 《銀行業(yè)風(fēng)險(xiǎn)管理》課件
- 工程倫理 課件全套 李正風(fēng) 第1-9章 工程與倫理、如何理解倫理- 全球化視野下的工程倫理
評(píng)論
0/150
提交評(píng)論