一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - Java使用設(shè)計(jì)模式中的代理模式構(gòu)建項(xiàng)目的實(shí)例展示

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

2020-04-26 11:27layznet JAVA教程

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

概念

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 * 游戲者接口
 *
 */
public interface IGamePlayer {
 
  // 登錄游戲
  public void login(String user, String password);
 
  // 殺怪,網(wǎng)絡(luò)游戲的主要特色
  public void killBoss();
 
  // 升級(jí)
  public void upgrade();
 
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
 * 游戲者
 *
 */
public class GamePlayer implements IGamePlayer {
 
  private String name = "";
 
  // 通過構(gòu)造函數(shù)傳遞名稱
  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í)有很多方法,花錢買是一種,做任務(wù)也是一種
  public void upgrade() {
    System.out.println(this.name + " 又升了一級(jí)!");
  }
 
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
 * 客戶端 對(duì)被代理對(duì)象不可見
 */
public class GamePlayerProxy implements IGamePlayer {
 
  private IGamePlayer gamePlayer = null;//被代理對(duì)象
 
  // 通過構(gòu)造函數(shù)傳遞要對(duì)誰進(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();
  }
 
}

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*
 * 客戶端 對(duì)被代理對(duì)象不可見
 */
public class GamePlayerProxy2 implements IGamePlayer {
 
  private IGamePlayer gamePlayer = null;//被代理對(duì)象
 
  // 通過構(gòu)造函數(shù)傳遞要對(duì)誰進(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());
  }
 
}

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
 * 客戶端 對(duì)被代理對(duì)象不可見
 */
public class GamePlayerProxy3 {
 
  private IGamePlayer gamePlayer;
  // 通過構(gòu)造函數(shù)傳遞 被代練(代理)對(duì)象
  public GamePlayerProxy3(IGamePlayer gamePlayer) {
     this.gamePlayer = gamePlayer;
     System.out.println("我是一名代練,我玩的角色是別人的,可以動(dòng)態(tài)傳遞進(jìn)來");
  }
   
  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;
    }
     
  }
}

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class Test {
  public static void main(String[] args) {
    /*
     * 普通的靜態(tài)代理: 客戶端不知道被代理對(duì)象,由代理對(duì)象完成其功能的調(diào)用
     */
    IGamePlayer proxy = new GamePlayerProxy("X");
    System.out.println("開始時(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ì)象的方法的功能
     * 或者說:(面向切面:)在什么地方(連接點(diǎn)), 執(zhí)行什么行為(通知)
     * GamePlayerProxy3中是方法名為login時(shí)通知開始時(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ù)切面
     */
  }
}

打印:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
開始時(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)來
登錄時(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ù),通過后期的代理完成一件完成事務(wù),附帶的結(jié)果就是編程簡潔清晰。
 (2)代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用,這樣起到了的作用和保護(hù)了目標(biāo)對(duì)象的作用。
 (3)高擴(kuò)展性

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品国产精品国产偷麻豆 | 久久这里只有精品国产精品99 | 女人和拘做受全过程免费 | 图片亚洲va欧美va国产综合 | 女高h | 99热久久这里只精品国产www | 亚洲精品久久久久久婷婷 | 天堂色 | 亚州性夜夜射在线观看 | 色先锋av资源中文字幕 | 桃乃木香奈ipx在线播放 | 亚欧有色在线观看免费版高清 | 91视频破解版 | 韩国甜性涩爱在线播放 | 国产综合图区 | 逼逼流水了 | 60老妇性xxxxhd | 久久免费看少妇级毛片蜜臀 | 特级毛片免费观看视频 | 大胆人gogo888体艺术在线 | 日韩欧美亚洲一区二区综合 | 日本成日本片人免费 | 欧美日韩精品在线观看 | luan小说 | 欧美精品成人a多人在线观看 | 故意短裙公车被强好爽在线播放 | 青青草成人影院 | 午夜 在线播放 | 91香蕉视频网址 | 亚洲第一区二区快射影院 | 高清欧美videossexo免费 | 草草影院免费 | 色综合中文字幕在线亚洲 | 91啦在线视频 | 97色综合 | 国产网站免费观看 | 欧美日韩在线成人看片a | 美女禁区视频无遮挡免费看 | 波多野结衣被绝伦强在线观看 | 精品国产美女福利在线 | 亚洲羞羞裸色私人影院 |