设计模式—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()));
    }
    
}

你可能感兴趣的:(设计模式)