之前學習大話設計模式的時候就瞭解了代理模式,客戶端顯示執行的是代理的方法,其實代理實體真正執行的是被代理實體的方法,被代理實體在自己的方法中辛辛苦苦完成的功能被代理實體簡單的一個調用就被實現了,這樣其實就是給別人做了嫁衣。
當時瞭解到的是靜態代理模式,現在說說動態代理模式,相對而言,動態代理模式降低了耦合度,更方便了操作。並且在運行的時候才切入改變類的方法,而不需要預先定義它。
代碼:
遊戲玩家接口:
public interface IGameplayer {
public void login (String user,String password);
public void killBoss();
public void upGrade();
}
被代理類:遊戲玩家
public class Gameplayer implements IGameplayer {
private String name ="";
public Gameplayer(String name) {
this.name = name;
}
@Override
public void login(String user, String password) {
System.out.println(user+"登錄成功");
}
@Override
public void killBoss() {
System.out.println(this.name + "的遊戲號在打怪");
}
@Override
public void upGrade() {
System.out.println(this.name + "的遊戲號升級了");
}
}
代理類:代練
public class DynamicProxyHandler implements InvocationHandler {
private IGameplayer gameplayer;
public DynamicProxyHandler (IGameplayer player){
this.gameplayer = player;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("killBoss")){
System.out.println("代練打開了電腦");
}
return method.invoke(gameplayer,args);
}
}
客戶端:main方法
public class GamePlayerTest {
public static void main(String[] args) {
//遊戲玩家郭樂樂
IGameplayer player = new Gameplayer("郭樂樂");
//遊戲代練
InvocationHandler handler = new DynamicProxyHandler(player);
IGameplayer proxy =
(IGameplayer)Proxy.newProxyInstance(player.getClass().getClassLoader(),
new Class[]{IGameplayer.class}, handler);
//遊戲玩家的遊戲賬號密碼
proxy.login("電競郭樂樂","123456");
proxy.killBoss();
proxy.upGrade();
}
}
執行結果: