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

服務(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ò)展性

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 4虎影院永久地址www | 国产caonila在线观看 | 成人小视频在线观看免费 | 国产91精品在线观看 | 免费成年网 | 国产女主播福利在线 | 好姑娘在线观看完整版免费 | 青春学堂在线观看 | 女教师波多野结衣高清在线 | 好大用力深一点视频 | 青青草国产免费国产是公开 | 236z最新伦理 | 国产自拍影院 | 红楼影视h38bar在线线播放 | 国产精品亚洲精品观看不卡 | 亚洲2017久无码 | 91交换论坛 | 国产真实乱子伦xxxxchina | 国产欧美日韩综合二区三区 | 4455永久在线视频观看 | 5278欧美一区二区三区 | 日本老妇成熟 | 日本人妖网站 | 亚洲天堂精品视频 | 国产在线步兵一区二区三区 | 美女被灌浣肠失禁视频 | 成年人在线播放视频 | 国产欧美精品 | 亚洲天堂视频在线免费观看 | 亚洲 日本 天堂 国产 在线 | 天天操免费视频 | xxxxxx性受 | 四虎影视地址 | 亚洲午夜视频 | 波多野结衣作品在线观看 | 国产白白视频在线观看2 | 韩国帅男同gay网站 韩国三级在线播放 | 日本国产高清色www视频在线 | 国产成人福利免费观看 | 亚洲久草视频 | 福利视频一区二区牛牛 |