Java设计模式(十三):动态代理

基本介绍

思路如下

代码如下

Client

package dynamicagent;

public class Client {
    public static void main(String[] args) {
        TeacherDao teacherDao = new TeacherDao();
        ITeacherDao iTeacherDao = (ITeacherDao) new ProxyFactory(teacherDao).getProxyInstance();
        iTeacherDao.teacher();
    }
}

ITeacherDao

package dynamicagent;

public interface ITeacherDao {
    void teacher();
}

ProxyFactory

package dynamicagent;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactory {
    private Object targ;

    public ProxyFactory(Object targ) {
        this.targ = targ;
    }
    public Object getProxyInstance(){
        //被代理对象的类加载器 targ.getClass().getClassLoader()
        //被代理对象实现的接口 targ.getClass().getInterfaces()
        //执行被代理对象方法时会触发事件处理器 传入被代理对象方法 new InvocationHandler()
        return Proxy.newProxyInstance(targ.getClass().getClassLoader(),targ.getClass().getInterfaces(),new InvocationHandler(){

            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("JDK代理开始");
                Object returnVal= method.invoke(targ,args);
                return returnVal;
            }
        });
    }
}

TeacherDao

package dynamicagent;

public class TeacherDao implements ITeacherDao {
    @Override
    public void teacher() {
        System.out.println("老师讲课了");
    }
}

好处就是相较于静态代理接口增加方法只需维护被代理对象,也不用创建多个代理对象类,全部由动态创建。

猜你喜欢

转载自blog.csdn.net/qq_39046786/article/details/113871584