最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用設計模式中的代理模式構建項目的實例展示

 更新時間:2016年05月09日 09:42:06   作者:layznet  
這篇文章主要介紹了Java使用設計模式中的代理模式構建項目的實例展示,代理模式中的代理對象可以在客戶端和目標對象之間起到中介的作用,需要的朋友可以參考下

概念

代理模式(Proxy):代理模式其實就是多一個代理類出來,替原對象進行一些操作。比如咱有的時候打官司需要請律師,因為律師在法律方面有專長,可以替咱進行操作表達咱的想法,這就是代理的意思。代理模式分為兩類:1、靜態(tài)代理(不使用jdk里面的方法);2、動態(tài)代理(使用jdk里面的InvocationHandler和Proxy)。
靜態(tài)代理由程序員創(chuàng)建或工具生成代理類的源碼,再編譯代理類。所謂靜態(tài)也就是在程序運行前就已經存在代理類的字節(jié)碼文件,代理類和委托類的關系在運行前就確定了。
動態(tài)代理類的源碼是在程序運行期間由JVM根據(jù)反射等機制動態(tài)的生成,所以不存在代理類的字節(jié)碼文件。代理類和委托類的關系是在程序運行時確定。

示例
這里我們舉一個靜態(tài)代理的例子:
類圖:

20165993519867.jpg (341×215)

/** 
 * 游戲者接口 
 * 
 */ 
public interface IGamePlayer { 
 
  // 登錄游戲 
  public void login(String user, String password); 
 
  // 殺怪,網絡游戲的主要特色 
  public void killBoss(); 
 
  // 升級 
  public void upgrade(); 
 
} 

/** 
 * 游戲者 
 * 
 */ 
public class GamePlayer implements IGamePlayer { 
 
  private String name = ""; 
 
  // 通過構造函數(shù)傳遞名稱 
  public GamePlayer(String _name) { 
    this.name = _name; 
  } 
 
  // 打怪,最期望的就是殺老怪 
 
  public void killBoss() { 
 
    System.out.println(this.name + " 在打怪!"); 
 
  } 
 
  // 進游戲之前你肯定要登錄吧,這是一個必要條件 
  public void login(String user, String password) { 
    System.out.println("登錄名為" + user + " 的角色 " + this.name + "登錄成功!"); 
  } 
 
  // 升級,升級有很多方法,花錢買是一種,做任務也是一種 
  public void upgrade() { 
    System.out.println(this.name + " 又升了一級!"); 
  } 
 
} 

/** 
 * 客戶端 對被代理對象不可見 
 */ 
public class GamePlayerProxy implements IGamePlayer { 
 
  private IGamePlayer gamePlayer = null;//被代理對象 
 
  // 通過構造函數(shù)傳遞要對誰進行代練 
  public GamePlayerProxy(String username) { 
    this.gamePlayer = new GamePlayer(username); 
  } 
 
  // 代練殺怪 
  public void killBoss() { 
    this.gamePlayer.killBoss(); 
  } 
 
  // 代練登錄 
  public void login(String user, String password) { 
    this.gamePlayer.login(user, password); 
  } 
 
  // 代練升級 
  public void upgrade() { 
    this.gamePlayer.upgrade(); 
  } 
 
} 

/* 
 * 客戶端 對被代理對象不可見 
 */ 
public class GamePlayerProxy2 implements IGamePlayer { 
 
  private IGamePlayer gamePlayer = null;//被代理對象 
 
  // 通過構造函數(shù)傳遞要對誰進行代練 
  public GamePlayerProxy2(String username) { 
    this.gamePlayer = new GamePlayer(username); 
  } 
 
  // 代練殺怪 
  public void killBoss() { 
    this.gamePlayer.killBoss(); 
  } 
 
  // 代練登錄 
  public void login(String user, String password) { 
    System.out.println("登錄時間是:" + new Date().toLocaleString()); 
    this.gamePlayer.login(user, password); 
  } 
 
  // 代練升級 
  public void upgrade() { 
    this.gamePlayer.upgrade(); 
    System.out.println("升級時間是:" + new Date().toLocaleString()); 
  } 
 
} 


/* 
 * 客戶端 對被代理對象不可見 
 */ 
public class GamePlayerProxy3 { 
 
  private IGamePlayer gamePlayer; 
  // 通過構造函數(shù)傳遞 被代練(代理)對象 
  public GamePlayerProxy3(IGamePlayer gamePlayer) { 
     this.gamePlayer = gamePlayer; 
     System.out.println("我是一名代練,我玩的角色是別人的,可以動態(tài)傳遞進來"); 
  } 
   
  public IGamePlayer getProxy() { 
    return (IGamePlayer) Proxy.newProxyInstance(this.getClass().getClassLoader(),  
        new Class[]{IGamePlayer.class}, new MyInvocationHandler()); 
  } 
 
  private class MyInvocationHandler implements InvocationHandler { 
   
    @Override 
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
      if (method.getName().equals("login")) { 
        System.out.println("登錄時間是:" + new Date().toLocaleString()); 
      } if (method.getName().equals("upgrade")) { 
        System.out.println("升級時間是:" + new Date().toLocaleString()); 
      } 
      method.invoke(gamePlayer, args); 
      return null; 
    } 
     
  } 
} 


public class Test { 
  public static void main(String[] args) { 
    /* 
     * 普通的靜態(tài)代理: 客戶端不知道被代理對象,由代理對象完成其功能的調用 
     */ 
    IGamePlayer proxy = new GamePlayerProxy("X"); 
    System.out.println("開始時間是:" + new Date().toLocaleString()); 
    proxy.login("zhangSan", "abcd"); 
    proxy.killBoss(); 
    proxy.upgrade(); 
    System.out.println("結束時間是:" + new Date().toLocaleString()); 
     
    System.out.println(); 
     
    /* 
     * 代理對象 增強了 被代理對象的功能 
     */ 
    IGamePlayer proxy2 = new GamePlayerProxy2("M"); 
    proxy2.login("lisi", "efg"); 
    proxy2.killBoss(); 
    proxy2.upgrade(); 
     
    System.out.println(); 
     
    /* 
     * 動態(tài)代理:使用jdk提供的InvocationHandler,反射調用被代理對象的方法 
     * 結合java.reflect.Proxy 產生代理對象 
     * 動態(tài)傳入被代理對象構造InvocationHandler,在handler中的invoke時可以增強被代理對象的方法的功能 
     * 或者說:(面向切面:)在什么地方(連接點), 執(zhí)行什么行為(通知) 
     * GamePlayerProxy3中是方法名為login時通知開始時間,upgrade時通知結束時間 
     */ 
    GamePlayerProxy3 dynamic = new GamePlayerProxy3(new GamePlayer("Y")); 
    IGamePlayer dynamicPlayer = dynamic.getProxy(); 
    dynamicPlayer.login("wangwu", "1234"); 
    dynamicPlayer.killBoss(); 
    dynamicPlayer.upgrade(); 
    /* 
     * 面向切面: 一些相似的業(yè)務邏輯需要加在眾多的地方,那們就可以把它提取到切面中, 切面也就是事務切面:如日志切面、權限切面、業(yè)務切面 
     */ 
  } 
} 

打?。?br />

開始時間是:2014-10-8 17:19:05 
登錄名為zhangSan 的角色 X登錄成功! 
X 在打怪! 
X 又升了一級! 
結束時間是:2014-10-8 17:19:05 
 
登錄時間是:2014-10-8 17:19:05 
登錄名為lisi 的角色 M登錄成功! 
M 在打怪! 
M 又升了一級! 
升級時間是:2014-10-8 17:19:05 
 
我是一名代練,我玩的角色是別人的,可以動態(tài)傳遞進來 
登錄時間是:2014-10-8 17:19:05 
登錄名為wangwu 的角色 Y登錄成功! 
Y 在打怪! 
升級時間是:2014-10-8 17:19:05 
Y 又升了一級! 


 優(yōu)點 
 (1)職責清晰
 真實的角色就是實現(xiàn)實際的業(yè)務邏輯,不用關心其他非本職責的事務,通過后期的代理完成一件完成事務,附帶的結果就是編程簡潔清晰。
 (2)代理對象可以在客戶端和目標對象之間起到中介的作用,這樣起到了的作用和保護了目標對象的作用。
 (3)高擴展性

相關文章

  • java模擬實現(xiàn)銀行ATM機操作

    java模擬實現(xiàn)銀行ATM機操作

    這篇文章主要為大家詳細介紹了java模擬實現(xiàn)銀行ATM機操作,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 一文帶你深入理解Java?AbstractQueuedSynchronizer

    一文帶你深入理解Java?AbstractQueuedSynchronizer

    在并發(fā)編程中,鎖是一種保證線程安全的方式,這篇文章主要為大家介紹了AbstractQueuedSynchronizer(AQS)的數(shù)據(jù)結構及實現(xiàn)原理,感興趣的小伙伴可以了解一下
    2023-07-07
  • 詳解Java實現(xiàn)分治算法

    詳解Java實現(xiàn)分治算法

    分治算法(divide and conquer)是五大常用算法(分治算法、動態(tài)規(guī)劃算法、貪心算法、回溯法、分治界限法)之一,很多人在平時學習中可能只是知道分治算法,但是可能并沒有系統(tǒng)的學習分治算法,本篇就帶你較為全面的去認識和了解分治算法
    2021-06-06
  • java向下轉型基礎知識點及實例

    java向下轉型基礎知識點及實例

    在本篇文章里小編給大家整理的是一篇關于java向下轉型基礎知識點及實例內容,有興趣的朋友們可以學習下。
    2021-05-05
  • 解決Feign調用的GET參數(shù)傳遞的問題

    解決Feign調用的GET參數(shù)傳遞的問題

    這篇文章主要介紹了解決Feign調用的GET參數(shù)傳遞的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • JAVA實現(xiàn)用戶抽獎功能(附完整代碼)

    JAVA實現(xiàn)用戶抽獎功能(附完整代碼)

    這篇文章主要給大家介紹了關于JAVA實現(xiàn)用戶抽獎功能的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • springboot實現(xiàn)string轉json json里面帶數(shù)組

    springboot實現(xiàn)string轉json json里面帶數(shù)組

    這篇文章主要介紹了springboot實現(xiàn)string轉json json里面帶數(shù)組,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Spring Security源碼解析之權限訪問控制是如何做到的

    Spring Security源碼解析之權限訪問控制是如何做到的

    Spring Security 中對于權限控制默認已經提供了很多了,但是,一個優(yōu)秀的框架必須具備良好的擴展性,下面小編給大家介紹Spring Security源碼解析之權限訪問控制是如何做到的,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • mall整合SpringTask實現(xiàn)定時任務的方法示例

    mall整合SpringTask實現(xiàn)定時任務的方法示例

    這篇文章主要介紹了mall整合SpringTask實現(xiàn)定時任務的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-06-06
  • 在SpringBoot項目中如何實現(xiàn)線程池的動態(tài)監(jiān)控

    在SpringBoot項目中如何實現(xiàn)線程池的動態(tài)監(jiān)控

    Spring Boot因其簡便、高效的特點廣受開發(fā)者喜愛,在復雜的業(yè)務場景下,如何確保Spring Boot應用的高性能和穩(wěn)定性成為了一個關鍵問題,其中,線程池的管理策略直接影響到系統(tǒng)的吞吐量和資源利用效率,本文將重點探討在Spring Boot項目中,如何實現(xiàn)線程池的動態(tài)監(jiān)控
    2023-10-10

最新評論

和平县| 双柏县| 德庆县| 福安市| 特克斯县| 溧阳市| 柘荣县| 侯马市| 上虞市| 葫芦岛市| 开江县| 布尔津县| 惠安县| 福贡县| 连城县| 师宗县| 柳江县| 孝义市| 德令哈市| 当阳市| 桓仁| 陇西县| 溧阳市| 吴忠市| 昭平县| 常山县| 英吉沙县| 宜良县| 台前县| 定远县| 新丰县| 香河县| 徐汇区| 腾冲县| 张家川| 花莲县| 交口县| 木兰县| 乐平市| 广宁县| 阳信县|