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

Java使用設(shè)計(jì)模式中的代理模式構(gòu)建項(xiàng)目的實(shí)例展示

 更新時(shí)間:2016年05月09日 09:42:06   作者:layznet  
這篇文章主要介紹了Java使用設(shè)計(jì)模式中的代理模式構(gòu)建項(xiàng)目的實(shí)例展示,代理模式中的代理對(duì)象可以在客戶(hù)端和目標(biāo)對(duì)象之間起到中介的作用,需要的朋友可以參考下

概念

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

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

20165993519867.jpg (341×215)

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

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

/** 
 * 客戶(hù)端 對(duì)被代理對(duì)象不可見(jiàn) 
 */ 
public class GamePlayerProxy implements IGamePlayer { 
 
  private IGamePlayer gamePlayer = null;//被代理對(duì)象 
 
  // 通過(guò)構(gòu)造函數(shù)傳遞要對(duì)誰(shuí)進(jìn)行代練 
  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); 
  } 
 
  // 代練升級(jí) 
  public void upgrade() { 
    this.gamePlayer.upgrade(); 
  } 
 
} 

/* 
 * 客戶(hù)端 對(duì)被代理對(duì)象不可見(jiàn) 
 */ 
public class GamePlayerProxy2 implements IGamePlayer { 
 
  private IGamePlayer gamePlayer = null;//被代理對(duì)象 
 
  // 通過(guò)構(gòu)造函數(shù)傳遞要對(duì)誰(shuí)進(jìn)行代練 
  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("登錄時(shí)間是:" + new Date().toLocaleString()); 
    this.gamePlayer.login(user, password); 
  } 
 
  // 代練升級(jí) 
  public void upgrade() { 
    this.gamePlayer.upgrade(); 
    System.out.println("升級(jí)時(shí)間是:" + new Date().toLocaleString()); 
  } 
 
} 


/* 
 * 客戶(hù)端 對(duì)被代理對(duì)象不可見(jiàn) 
 */ 
public class GamePlayerProxy3 { 
 
  private IGamePlayer gamePlayer; 
  // 通過(guò)構(gòu)造函數(shù)傳遞 被代練(代理)對(duì)象 
  public GamePlayerProxy3(IGamePlayer gamePlayer) { 
     this.gamePlayer = gamePlayer; 
     System.out.println("我是一名代練,我玩的角色是別人的,可以動(dòng)態(tài)傳遞進(jìn)來(lá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("登錄時(shí)間是:" + new Date().toLocaleString()); 
      } if (method.getName().equals("upgrade")) { 
        System.out.println("升級(jí)時(shí)間是:" + new Date().toLocaleString()); 
      } 
      method.invoke(gamePlayer, args); 
      return null; 
    } 
     
  } 
} 


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

打?。?br />

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


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

相關(guān)文章

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

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

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

    一文帶你深入理解Java?AbstractQueuedSynchronizer

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

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

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

    java向下轉(zhuǎn)型基礎(chǔ)知識(shí)點(diǎn)及實(shí)例

    在本篇文章里小編給大家整理的是一篇關(guān)于java向下轉(zhuǎn)型基礎(chǔ)知識(shí)點(diǎn)及實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-05-05
  • 解決Feign調(diào)用的GET參數(shù)傳遞的問(wèn)題

    解決Feign調(diào)用的GET參數(shù)傳遞的問(wèn)題

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

    JAVA實(shí)現(xiàn)用戶(hù)抽獎(jiǎng)功能(附完整代碼)

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

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

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

    Spring Security源碼解析之權(quán)限訪問(wèn)控制是如何做到的

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

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

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

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

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

最新評(píng)論

微山县| 林甸县| 西丰县| 凭祥市| 乐都县| 色达县| 通许县| 海城市| 津南区| 当雄县| 邵阳市| 讷河市| 台湾省| 泽库县| 隆尧县| 钟山县| 辉南县| 渝中区| 蓬溪县| 思茅市| 安岳县| 土默特左旗| 石家庄市| 中宁县| 宜黄县| 安岳县| 巴南区| 蓝山县| 北票市| 屏东县| 萝北县| 辽宁省| 枣强县| 班玛县| 山丹县| 阜康市| 文成县| 吴江市| 旬阳县| 安宁市| 龙山县|