天天看點

設計模式—JDK動态代理

概述
  1. 主題角色接口,主要用來定義操作;
  2. 主題角色接口實作類,主要實作接口中定義的操作;
  3. 主題角色處理器類,該類實作 java.lang.reflect.InvocationHandler 接口,并定義主題角色實作類方法被調用前或調用後的其他處理;
主題角色接口
public interface IGamePlayer {
    //登入
    void login(String user,String password);
    //殺怪
    void killBoss();
    //更新
    void upgrage();
    //每個人都可以找一下自己的代理

}      
題角色接口實作類
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 + "的使用者" + this.name+ "登入成功!");
    }

    @Override
    public void killBoss() {
        System.out.println(this.name + "在打怪");
    }

    @Override
    public void upgrage() {
        System.out.println(this.name + "又升了一級");
    }

}      
主題角色處理器類
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class GamePlayIH implements InvocationHandler {

    //被代理者
    Class cls = null;
    //被代理的執行個體
    Object obj = null;

    //我要代理誰
    public GamePlayIH(Object obj) {
        this.obj = obj;
    }

    //調用被代理的方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Thread.sleep(1200);
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(df.format(new Date()) + " 方法:" + method.getName() + "被調用");
        Object result = method.invoke(this.obj,args);
        return result;
    }

}      
用戶端類
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Client {

    public static void main(String[] args) {
        //定義一個癡迷的玩家
        IGamePlayer player = new GamePlayer("張三");
        //定義一個handler
        InvocationHandler handler = new GamePlayIH(player);
        //開始打遊戲,記下時間戳
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("開始時間是:" + df.format(new Date()));
        //獲得類的class loader
        ClassLoader c1 = player.getClass().getClassLoader();
        //動态産生一個代理者
        IGamePlayer proxy = (IGamePlayer) Proxy.newProxyInstance(c1,new Class[]{IGamePlayer.class},handler);
        //登入
        proxy.login("zhangsan","1234");
        //開始殺怪
        proxy.killBoss();
        //更新
        proxy.upgrage();
        //記錄結束遊戲時間
        System.out.println("結束時間是:" + df.format(new Date()));
    }
    
}