大B:“已註冊的用戶擁有發帖,修改自己的註冊信息,修改自己的帖子等功能;而遊客只能看到別人發的帖子,沒有其他權限。爲了簡化代碼,更好的顯示出代理模式的骨架,我們這裡只實現發帖權限的控制。首先我們先實現一個抽象主題角色MyForum,裡面定義了真實主題和代理主題的共同接口——發帖功能。”
代碼如下:
publicinterfaceMyForum
{
publicvoidAddFile();
}
大B:“這樣,真實主題角色和代理主題角色都要實現這個接口。其中真實的主題角色基本就是將這個接口的方法內容填充進來。所以在這裡就不再說它的實現。我們把主要的精力放到關鍵的代理主題角色上。”
代理主題角色代碼大體如下:
publicclassMyForumProxyimplementsMyForum
{
privateRealMyForumforum;
privateintpermission;//權限值
publicMyForumProxy(intpermission)
{
forum=newRealMyForum()
this.permission=permission;
}
//實現的接口
publicvoidAddFile()
{//滿足權限設置的時候才能夠執行操作
//Constants是一個常量類
if(Constants.ASSOCIATOR……permission)
{
forum.AddFile();
}
else
System.out.println(“YouarenotaassociatorofMyForum,pleaseregiste!”);
}
}
大B:“這樣就實現了代理模式的功能。當然你也可以在這個代理類上添加自己的方法來實現額外的服務,比如統計帖子的瀏覽次數,記錄用戶的登錄情況等等。還有一個很常見的代理模式的使用例子就是對大幅圖片瀏覽的控制。”
小A:“當我們在網站上面瀏覽圖文的信息時,圖片位置放置的是經過縮小的,當有人要詳細的查看這個圖片時,可以通過點擊圖片來激活一個鏈接,在一個新的網頁打開要看的圖片。”
大B:“嗯。對。這樣對於提高瀏覽速度是很有好處的,因爲不是每個人都要去看詳細圖上的信息。”
小A:“是嗎?”
大B:“這種情況就可以使用代理模式來全面實現。這裡我將思路表述出來,至於實現就不表述了,至於這種方式在B/S模式下的真實可行性,只是憑空的想象。如果不是可行的方式,那這個例子可以放到一個C/S下來實現,這個是絕對沒有問題的。我們在瀏覽器中訪問網頁時是調用的不是真實的裝載圖片的方法,而是在代理對象中的方法,在這個對象中,先使用一個線程向瀏覽器裝載了一個縮小版的圖片,而在後臺使用另一個線程來調用真實的裝載大圖片的方法將圖片加載到本地,當要瀏覽這個圖片的時候,將其在新的網頁中顯示出來。當然如果在想瀏覽的時候圖片尚未加載成功,可以再啓動一個線程來顯示提示信息,直到加載成功。這樣代理模式的功能就在上面體現的淋漓盡致——通過代理來將真實圖片的加載放到後臺來操作,使其不影響前臺的瀏覽。代理模式能夠協調調用者和被調用者,能夠在一定程度上降低系統的耦合度。不過一定要記住前面講的使用代理模式的條件,不然的話使用了代理模式不但不會有好的效果,說不定還會出問題的。”