<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

    精解Java中代理模式的實現

      簡介摘要: 代理模式是GOF設計模式中的一種,常用于權限模塊的架構設計,其根本的原理是通過將一個代理對象交給調用者,使得調用者不能直接使用相應的功能模塊,所 有的調用被傳遞給代理對象,代理對象負責對真實模塊完成調用,在調用者與被調用者之間建立了一個隔離帶,我們可以使 代理模式是GOF設計模式中的一種,常用于權限模塊的架構設計,其根本的原理是通過將一個代理對象交給調用者,使得調用者不能直接使用相應的功能模塊,所有的調用被傳遞給代理對象,代理對象負責對真實模塊完成調用,在調用者與被調用者[bei tiao yong zhe]之間建立了一個隔離帶,我們可以使用這個隔離帶進行權限檢查、對象的延遲[yan chi] 加載等功能的實現。這里不對這個設計模式的具體原理多加解釋[jie shi],我們直接通過一個實例的編寫來完成對代理模式的應用[ying yong],在理解了代理模式之后,我們將繼續介紹 java中提供的一種動態[dong tai]代理技術與其實現。

      這里我們假設有一個用戶管理模塊,這個模塊提供了添加用戶、刪除用戶的功能。我們現在要使用代理模式來檢查權限該如何實現呢?首先我們需要具有一個類叫User用來表示一個用戶的信息[xin xi],代碼如下:

  • public class User { 
  •        private String username; 
  •        private String password; 
  •        public User() { 
  •        } 
  •        public User(String username, String password) { 
  •                this.username = username; 
  •                this.password = password; 
  •        } 
  •  }
  •   為了提供功能模塊,并且希望能夠隔離模塊,我們需要設計一個接口來定義用戶管理模塊的接口,這里我們定義IUserFace接口,代碼如下:

  • public interface IUserFace { 
  •        public void addUser(User user); 
  •        public void removeUser(User user); 
  • }
  •   接下來為這個接口編寫一個真正實現具體功能的類出來,定義為UserFaceImpl,代碼如下:

  • public class UserFaceImpl implements IUserFace { 
  •        public void addUser(User user) { 
  •                //這里處理相關的添加用戶的代碼任務 
  •                //比如說連接數據庫,執行相關的SQL語句 
  •                System.out.println("Add User Successfully"); 
  •        } 
  •        public void removeUser(User user) { 
  •                //這里處理相關的刪除用戶的代碼任務 
  •                //比如說連接數據庫,執行相關的SQL語句 
  •                System.out.println("Remove User Successfully"); 
  •        } 
  • }
  •   好了,現在我們對外提供的功能具備了,那么使用者該如何使用這個功能的實現類呢?為了讓外界對具體功能類的使用透明化,我們實現一個工廠類來負責創造具體功能模塊的對象,并以接口的形式提供外界使用,這樣將來更換相關模塊的使用將會比較方便。具體工廠類(FaceFactory)代碼如下:

  • public class FaceFactory { 
  •        private static FaceFactory instance; 
  •        private FaceFactory() { 
  •        } 
  •        public static FaceFactory getInstance() { 
  •                if(instance == null) { 
  •                        instance = new FaceFactory(); 
  •                } 
  •                return instance; 
  •        } 
  •        public IUserFace createUserFace() { 
  •                return new UserFaceImpl(); 
  •        } 
  • }

  •  完成了工廠類的代碼,我們可以使用具體模塊,這里我們編寫一個App.java來使用以下具體功能模塊,代碼如下:

  • public class App { 
  •        public static void main(String args[]) { 
  •                User u = new User(); 
  •                IUserFace uf = FaceFactory.getInstance().createUserFace(); 
  •                uf.addUser(u); 
  •        } 
  • }
  •   從上面代碼我們可以看到,代碼中并沒有提及UserFaceImpl這個類,這保證了將來如果需要跟換UserFaceImpl這個類的使用,調用者的代碼將不需要做任何的修改。好了,現在我們要來研究一下權限的問題,在這個例子中,我們可能需要在添加用戶或者刪除用戶的時候進行權限檢查,符合權限的才能執行相關動作,否則不能執行,那么該如何修改代碼才能更加貼切,而且在實際的編寫過程中,雖然我們需要權限模塊,但有時候為了更好地快速測試,我們常常希望暫時關閉權限模塊,如何才能讓這樣的臨時需求變得更加容易處理呢?我們現在使用代理模式來完成這樣的任務,現在繼續編寫一個類叫 UserFaceProxy,讓它也實現IUserFace接口,也許你會說,不是已經有一個類實現了這個接口了嗎?為什么還要寫一個?不要著急,看完這個代碼,你就會了解其中的道理了。

  • public class UserFaceProxy implements IUserFace { 
  •        private IUserFace userFace; 
  •        public UserFaceProxy(IUserFace userFace) { 
  •                this.userFace = userFace; 
  •        } 
  •        public void addUser(User user) { 
  •                //在這里檢查權限,如果權限不合法則拋出異常
  •                userFace.addUser(user); 
  •        } 
  •        public void removeUser(User user) { 
  •                //在這里檢查權限,如果權限不合法則拋出異常
  •                //如果權限通過則完成下面的工作 
  •                userFace.removeUser(user); 
  •        } 
  • }
  •   在代碼中你可以看到,這個代理類在構造對象的時候需要傳入一個實現了IUserFace接口的類的對象,當代理類對象的方法被調用的時候,首先檢查權限,如果權限檢查不通過,那么則拋出異常,通過的話則調用構造時傳入對象的相應方法]來完成真是的工作。這樣的話,我們需要繼續修改工廠類的代碼如下:

  • public class FaceFactory { 
  •        private static FaceFactory instance; 
  •        private FaceFactory() { 
  •        } 
  •        public static FaceFactory getInstance() { 
  •                if(instance == null) { 
  •                        instance = new FaceFactory(); 
  •                } 
  •                return instance; 
  •        } 
  •        public IUserFace createUserFace() { 
  •                IUserFace userFace = new UserFaceImpl(); 
  •                IUserFace proxy = new UserFaceProxy(userFace); 
  •                return proxy; 
  •        } 
  • }
  •   好了,到這里你是不是已經明白了?通過這樣的代理模式我們完成了權限檢查的隔離處理,當需要臨時關閉權限檢查的時候,我們只需要在如上的代碼中return userFace;就可以了。這就是代理模式在實際中的應用步驟。


    posted on 2011-12-05 13:32 順其自然EVO 閱讀(138) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2011年12月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 精品国产亚洲男女在线线电影| 国产精品色午夜免费视频| 亚洲人成网站在线观看播放| 污视频网站免费观看| 亚洲一区二区视频在线观看| 一级成人毛片免费观看| 国产AV无码专区亚洲AWWW| 中文毛片无遮挡高清免费| 久久亚洲AV无码精品色午夜麻| 国产一级片免费看| 亚洲视频在线观看网址| 中文字幕免费在线看线人| 亚洲香蕉久久一区二区| 久久不见久久见中文字幕免费| 亚洲成在人线aⅴ免费毛片 | 亚洲免费观看网站| 亚洲精品视频免费看| 日韩一区二区a片免费观看| 亚洲av无码专区首页| 337p日本欧洲亚洲大胆裸体艺术| 99在线热播精品免费99热| 亚洲精品熟女国产| 免费激情视频网站| a一级毛片免费高清在线| 亚洲综合成人网在线观看| 欧美日韩国产免费一区二区三区 | 色久悠悠婷婷综合在线亚洲| 国产一级淫片a免费播放口| 亚洲国产精品久久人人爱| 热久久精品免费视频| 中文字幕免费人成乱码中国| 亚洲熟妇av一区| 免费观看国产小粉嫩喷水| 精品国产污污免费网站| 亚洲av无码专区首页| 久久久久亚洲Av片无码v| 在线不卡免费视频| 大地资源网高清在线观看免费| 亚洲小说图片视频| 久久精品国产亚洲精品| xxxx日本免费|