代理模式也叫委托模式。
代理模式定義:對其他對象提供一種代理從而控制對這個對象的訪問。就是,代理類 代理 被代理類,來執行被代理類里的方法。
一般情況下,代理模式化有三個角色。
1,抽象的主題類(或者接口) IGamePlayer
2,代理類。
3,被代理類。
下面以游戲玩家代理為例。
一,先來看下最基本的代理模式。
代碼如下:
主題接口:
1 package com.yemaozi.proxy.base; 2 3 //游戲玩家主題接口 4 public interface IGamePlayer { 5 //登錄游戲 6 public void login(String username, String password); 7 8 //擊殺Boss 9 public void killBoss(); 10 11 //升級 12 public void upGrade(); 13 }
被代理類:
1 package com.yemaozi.proxy.base; 2 3 //需要代理的主題類。 4 public class GamePlayer implements IGamePlayer{ 5 6 private String name = ""; 7 8 public GamePlayer(String name){ 9 this.name = name; 10 } 11 12 public void login(String username, String password) { 13 System.out.println("登錄名為 "+username+" 進入游戲," + name + " 登錄成功!"); 14 } 15 16 public void killBoss() { 17 System.out.println(this.name + " 擊殺了Boss!"); 18 } 19 20 public void upGrade() { 21 System.out.println(this.name + "升級了!"); 22 } 23 24 }
代理類:
1 package com.yemaozi.proxy.base; 2 3 //代理類 4 //代理也是個游戲玩家,所以也要實現IGamePlayer 5 public class ProxyGamePlayer implements IGamePlayer{ 6 7 private IGamePlayer proxyGp = null; 8 9 //代理需要獲取被代理的信息,就是執行被代理所要執行的方法, 10 //所以要獲取被代理的對象。這里通過構造方法獲取。 11 public ProxyGamePlayer(GamePlayer gp){ 12 this.proxyGp = gp; 13 } 14 15 public void login(String username, String password) { 16 System.out.println("代理登錄的游戲!"); 17 proxyGp.login(username, password); 18 } 19 20 public void killBoss() { 21 proxyGp.killBoss(); 22 } 23 24 public void upGrade() { 25 proxyGp.upGrade(); 26 } 27 }
先來看下不用代理類的場景類:
1 package com.yemaozi.proxy.base; 2 3 //這是正常的,用非代理的情況下。 4 public class Client { 5 public static void main(String [] args){ 6 IGamePlayer gp = new GamePlayer("張三"); 7 //開始執行主題接口中的方法。 8 //登錄游戲 9 gp.login("zhangsan", "123456"); 10 //殺怪 11 gp.killBoss(); 12 //升級 13 gp.upGrade(); 14 } 15 } 16 17 執行結果: 18 登錄名為 zhangsan 進入游戲,張三 登錄成功! 19 張三 擊殺了Boss! 20 張三升級了!
游戲也有玩累,玩乏的時候,所以找個代練來升級。下面就是代理類的場景類。
1 package com.yemaozi.proxy.base; 2 3 //代理客戶端 4 public class BasePoxyClient { 5 public static void main(String[] args){ 6 IGamePlayer proxyGp = new ProxyGamePlayer(new GamePlayer("張三")); 7 proxyGp.login("zhangsan", "123456"); 8 proxyGp.killBoss(); 9 proxyGp.upGrade(); 10 } 11 } 12 13 執行結果為: 14 代理登錄的游戲! 15 登錄名為 zhangsan 進入游戲,張三 登錄成功! 16 張三 擊殺了Boss! 17 張三升級了!
執行還是這樣,但是可以看出,確實是代理類來執行的。這就是最簡單的代理模式了。
代理模式還是有很多種的,比如,普通代理模式,強制代理模式,虛擬代理模式,動態代理模式.....
接下來我們一一來看。
二,普通代理模式:
其實普通代理模式和上面的差不多。
普通代理模式,它不用知道代理的真實角色是誰,屏蔽了真實角色的更變對高層模塊的影響。
(本例中,就是,不用知道為誰代練游戲,只需要知道代練游戲的用戶名,密碼即可。)
代碼如下:
抽象主題類或者接口:
1 package com.yemaozi.proxy.common; 2 3 /** 4 * 普通代理模式:就是我們要知道代理的存在,然后才能訪問(或者使用代理)。 5 * 對于基本的代理改動較小。只改變實現類中 6 * @author yemaozi 7 */ 8 public interface IGamePlayer { 9 //登錄游戲 10 public void login(String username, String password); 11 12 //擊殺Boss 13 public void killBoss(); 14 15 //升級 16 public void upGrade(); 17 }
需要被代理類:
1 package com.yemaozi.proxy.common; 2 3 public class GamePlayer implements IGamePlayer{ 4 5 private String name = ""; 6 7 //通過構造方法,將代理傳遞進來。 8 public GamePlayer(IGamePlayer proxyGp, String name){ 9 if(proxyGp == null){ 10 //處理非正常情況。 11 }else{ 12 this.name = name; 13 } 14 } 15 //登錄游戲 16 public void login(String username, String password) { 17 System.out.println("登錄名為 "+username+" 進入游戲," + name + " 登錄成功!"); 18 } 19 //殺Boss 20 public void killBoss() { 21 System.out.println(this.name + " 擊殺了Boss!"); 22 } 23 24 //升級 25 public void upGrade() { 26 System.out.println(this.name + "升級了!"); 27 } 28 29 }
代理類:
1 package com.yemaozi.proxy.common; 2 3 public class ProxyGamePlayer implements IGamePlayer{ 4 5 private IGamePlayer proxyGp = null; 6 7 public ProxyGamePlayer(String name){ 8 9 try { 10 //通過構造方法創建GamePlayer,同時將自己傳遞進去。用于在GamePlayer判斷業務邏輯 11 proxyGp = new GamePlayer(this, name); 12 } catch (Exception e) { 13 e.printStackTrace(); 14 } 15 } 16 17 public void login(String username, String password) { 18 System.out.println("代理登錄的游戲!"); 19 proxyGp.login(username, password); 20 } 21 22 public void killBoss() { 23 proxyGp.killBoss(); 24 } 25 26 public void upGrade() { 27 proxyGp.upGrade(); 28 } 29 30 }
看下場景類:
1 package com.yemaozi.proxy.common; 2 3 /** 4 * 普通代理模式,它不用知道代理的真實角色是誰,屏蔽了真實角色的更變對高層模塊的影響。 5 * (本例中,就是,不用知道為誰代練游戲,只需要知道代練游戲的用戶名,密碼即可。) 6 * @author yemaozi 7 * 8 */ 9 public class Client { 10 public static void main(String[] args){ 11 IGamePlayer proxyGp = new ProxyGamePlayer("張三"); 12 proxyGp.login("zhangsan", "123456"); 13 proxyGp.killBoss(); 14 proxyGp.upGrade(); 15 } 16 } 17 18 執行結果: 19 代理登錄的游戲! 20 登錄名為 zhangsan 進入游戲,張三 登錄成功! 21 張三 擊殺了Boss! 22 張三升級了!
在場景類中,我們發現,我們并不需要知道具體為誰代理,把被代理類進行了隱藏。所以,被代理若是有所修改,只要實現了對應接口中的方法,則不會影響代理的執行。
?
(下一篇)23種設計模式----------代理模式(二)
?