一、引子 ![]() 當然,圖上所示的是代理模式中的一個具體情況。而代理模式可以非常靈活的使用其他方式來實現,這樣就與圖上所示有很大的區別。 也許,現在你已經對代理模式已經有了一個宏觀的認識了,下面我們來看看怎么實際的使用代理模式。 四、舉例 以論壇中已注冊用戶和游客的權限不同來作為第一個例子:已注冊的用戶擁有發帖,修改自己的注冊信息,修改自己的帖子等功能;而游客只能看到別人發的帖子,沒有其他權限。為了簡化代碼,更好的顯示出代理模式的骨架,我們這里只實現發帖權限的控制。 首先我們先實現一個抽象主題角色MyForum,里面定義了真實主題和代理主題的共同接口——發帖功能。 代碼如下: public interface MyForum { public void AddFile(); } 這樣,真實主題角色和代理主題角色都要實現這個接口。其中真實的主題角色基本就是將這個接口的方法內容填充進來。所以在這里就不再贅述它的實現。我們把主要的精力放到關鍵的代理主題角色上。代理主題角色代碼大體如下: public class MyForumProxy implements MyForum { private RealMyForum forum ; private int permission ; //權限值 public MyForumProxy(int permission) { forum = new RealMyForum() this.permission = permission ; } //實現的接口 public void AddFile() { //滿足權限設置的時候才能夠執行操作 //Constants是一個常量類 if(Constants.ASSOCIATOR == permission) { forum.AddFile(); } else System.out.println("You are not a associator of MyForum ,please registe!"); } } 這樣就實現了代理模式的功能。當然你也可以在這個代理類上添加自己的方法來實現額外的服務,比如統計帖子的瀏覽次數,記錄用戶的登錄情況等等。 還有一個很常見的代理模式的使用例子就是對大幅圖片瀏覽的控制。在我們常見的網站上面瀏覽圖文的信息時,不知道你有沒有注意到,圖片位置放置的是經過縮小的,當有人要仔細的查看這個圖片時,可以通過點擊圖片來激活一個鏈接,在一個新的網頁打開要看的圖片 。這樣對于提高瀏覽速度是很有好處的,因為不是每個人都要去看仔細圖上的信息。這種情況就可以使用代理模式來全面實現。這里我將思路表述出來,至于實現由于工作原因,就不表述了,至于這種方式在B/S模式下的真實可行性,我沒有確認過,只是憑空的想象。如果不是可行的方式,那這個例子可以放到一個C/S下來實現,這個是絕對沒有問題的,而且在很多介紹設計模式的書和文章中使用。兩種方式的實現有興趣的可以來嘗試一下。 我們在瀏覽器中訪問網頁時是調用的不是真實的裝載圖片的方法,而是在代理對象中的方法,在這個對象中,先使用一個線程向瀏覽器裝載了一個縮小版的圖片,而在后臺使用另一個線程來調用真實的裝載大圖片的方法將圖片加載到本地,當你要瀏覽這個圖片的時候,將其在新的網頁中顯示出來。當然如果在你想瀏覽的時候圖片尚未加載成功,可以再啟動一個線程來顯示提示信息,直到加載成功。 這樣代理模式的功能就在上面體現的淋漓盡致——通過代理來將真實圖片的加載放到后臺來操作,使其不影響前臺的瀏覽。 五、總結 代理模式能夠協調調用者和被調用者,能夠在一定程度上降低系統的耦合度。不過一定要記住前面講的使用代理模式的條件,不然的話使用了代理模式不但不會有好的效果,說不定還會出問題的 |
溫馨提示:喜歡本站的話,請收藏一下本站!