本文的例子和部分內(nèi)容均來(lái)自www.jdon.com的《GoF 23種設(shè)計(jì)模式》系列文章
一、Proxy模式的適用場(chǎng)合
1.授權(quán)機(jī)制
不同級(jí)別的用戶對(duì)同一對(duì)象擁有不同的訪問(wèn)權(quán)利,如Jive論壇系統(tǒng)中,就使用Proxy進(jìn)行授權(quán)機(jī)制控制,訪問(wèn)論壇有兩種人:注冊(cè)用戶和游客(未注冊(cè)用戶),Jive中就通過(guò)類似ForumProxy這樣的代理來(lái)控制這兩種用戶對(duì)論壇的訪問(wèn)權(quán)限.
2.某個(gè)客戶端不能直接操作到某個(gè)對(duì)象,但又必須和那個(gè)對(duì)象有所互動(dòng).
舉例兩個(gè)具體情況:
(1)如果那個(gè)對(duì)象是一個(gè)是很大的圖片,需要花費(fèi)很長(zhǎng)時(shí)間才能顯示出來(lái),那么當(dāng)這個(gè)圖片包含在文檔中時(shí),使用編輯器或?yàn)g覽器打開這個(gè)文檔,打開文檔必須很迅速,不能等待大圖片處理完成,這時(shí)需要做個(gè)圖片Proxy來(lái)代替真正的圖片.
(2)如果那個(gè)對(duì)象在Internet的某個(gè)遠(yuǎn)端服務(wù)器上,直接操作這個(gè)對(duì)象因?yàn)榫W(wǎng)絡(luò)速度原因可能比較慢,那我們可以先用Proxy來(lái)代替那個(gè)對(duì)象.
--摘自Jdon的《GoF 23種設(shè)計(jì)模式》
二、使用Proxy模式實(shí)現(xiàn)的授權(quán)機(jī)制
計(jì)模式/proxy_code1.jpg)
個(gè)人觀點(diǎn)一
從isSystemOrForumAdmin()方法體中我們可以看到權(quán)限設(shè)計(jì)的一種方法:
·定義一個(gè)表示權(quán)限的類,在這個(gè)類中定義所有的權(quán)限條目(例如這里的FORUM_ADMIN),以數(shù)字表示
·在這個(gè)類中定義一個(gè)數(shù)組,用于表示一個(gè)用戶所具有的所有權(quán)限的集合,數(shù)組的長(zhǎng)度就是所有權(quán)限的數(shù)目總和
·使用諸如values[FORM_ADMIN]來(lái)獲取用戶是否具有某一項(xiàng)權(quán)限
三、對(duì)Jive論壇中Proxy模式使用的理解
個(gè)人觀點(diǎn)二
Request --
(1)-->
ForumProxy --
(2)-->
ForumPermissions
| |
| <-----------
(3)------- | (權(quán)限驗(yàn)證通過(guò))
| |
(訪問(wèn))| -----------
(4)------> |
Form
從上面的代碼段和這個(gè)流程圖中我們可以看到Proxy模式實(shí)現(xiàn)權(quán)限驗(yàn)證的過(guò)程:
·請(qǐng)求都必須先經(jīng)過(guò)Proxy
·Proxy類中包含了一個(gè)Permission類,用于獲取當(dāng)前用戶所具有的權(quán)限
·Proxy類根據(jù)用戶的權(quán)限將請(qǐng)求轉(zhuǎn)發(fā)給真正的后臺(tái)對(duì)象或拒絕請(qǐng)求
Proxy類具有幾個(gè)特點(diǎn)
·
Proxy類一般都實(shí)現(xiàn)或繼承了后臺(tái)對(duì)象接口或抽象類,在其中實(shí)現(xiàn)了后臺(tái)對(duì)象接口的方法,這樣外界和代理類打交道的客戶端看到的是和后臺(tái)對(duì)象一樣的接口。根本不知道自在和代理對(duì)象打交道。
·
Proxy類一般都含有一個(gè)后臺(tái)對(duì)象作為其成員,因?yàn)榇眍愋枰谄鋵?shí)現(xiàn)接口的方法中調(diào)用后臺(tái)對(duì)象的真正方法來(lái)實(shí)現(xiàn)業(yè)務(wù)邏輯。
·
Proxy類一般都需要包含一個(gè)能夠驗(yàn)證用戶請(qǐng)求是否合法的對(duì)象,如上例中的ForumPermisssions類,作為轉(zhuǎn)發(fā)或拒絕用戶請(qǐng)求的判斷依據(jù)
四、Jive論壇中Proxy模式與Factory模式的結(jié)合
計(jì)模式/proxy_code4.jpg)
個(gè)人觀點(diǎn)三
Proxy結(jié)合Factory模式的實(shí)現(xiàn)流程
Request --(1)-- > ForumFactoryProxy --(2)-- > FourmPermissions
| |
| <----------- (3) ------------- | (驗(yàn)證通過(guò))
| |
| ------------- (4) -----------> | ForumFactory
| |
Forum | <------------ (5) ------------ | (創(chuàng)建)
| |
(封裝) | ------------- (6) -----------> | ForumProxy
可以看到這里有2個(gè)Proxy對(duì)象,一個(gè)是工廠的Proxy,一個(gè)是產(chǎn)品的Proxy,前者決定用戶是否有權(quán)創(chuàng)建一個(gè)Forum,后者決定用戶是否有權(quán)使用Forum。
但工廠創(chuàng)建出一個(gè)Form對(duì)象后,就將這個(gè)Forum對(duì)象和其它的對(duì)象傳給ForumProxy對(duì)象,以后所有對(duì)Forum的訪問(wèn)和操作都由ForumProxy來(lái)代理。(參見個(gè)人觀點(diǎn)二)
所以我們看到:假如我們不想讓用戶直接訪問(wèn)后臺(tái)對(duì)象或需要設(shè)置不同的訪問(wèn)、操作權(quán)限,我們就可以使用Proxy模式
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
posted on 2008-01-14 17:40
Paul Lin 閱讀(1517)
評(píng)論(0) 編輯 收藏 所屬分類:
模式與重構(gòu)