熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

精解Java中代理模式的實現

2013-11-23 19:27:17  來源: 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) {
               thisusername = username;
               thispassword = password;
       }
 }
  為了提供功能模塊並且希望[xi wang]能夠隔離模塊我們需要設計一個接口來定義用戶管理模塊的接口這裡我們定義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語句
               Systemoutprintln(Add User Successfully);
       }
       public void removeUser(User user) {
               //這裡處理相關的刪除用戶的代碼任務
               //比如說連接數據庫執行相關的SQL語句
               Systemoutprintln(Remove User Successfully);
       }
}
  好了現在我們對外提供的功能具備了那麼使用者該如何使用這個功能的實現類呢?為了讓外界對具體功能類的使用透明[tou ming]化我們實現一個工廠類來負責創造具體功能模塊的對象並以接口的形式提供外界使用這樣將來更換相關模塊的使用將會比較方便具體工廠類(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();
       }
}

  完成了工廠類的代碼我們可以使用具體模塊這裡我們編寫一個Appjava來使用以下具體功能模塊代碼如下

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

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

  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;就可以了這就是代理模式在實際中的應用[ying yong]步驟


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26887.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.