Java design pattern---agent mode (dynamic agent)

We create a TeacherDao class to teach, and we need to create an agent teacher to teach.

Step 1: Create an interface first

public interface ITTeacherDao {
    public void teach();
}

Step 2: Create a teacher class for teaching

public class TeacherDao implements ITTeacherDao {
    @Override
    public void teach() {
        System.out.println("老师正在讲课");
    }
}

Step 3: Use the JDK to create a proxy object

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

public class ProxyFactory {
    //维护一个目标对象 object
    private Object target;

    //构造器 对target进行初始化
    public ProxyFactory(Object target) {
        this.target = target;
    }

   //给目标对象  生成一个代理对象

    /***
     *
     *     public static Object newProxyInstance(ClassLoader loader,
                                               Class<?>[] interfaces,
                                                InvocationHandler h)
     ClassLoader loader :指定当前目标对象使用的类加载器,获取加载器的方法固定
     Class<?>[] interfaces:目标对象实现的接口类型,使用泛型方法确认类型
     InvocationHandler h:事情处理,执行目标对象的方法是,会出发事情处理器方法,会把当前执行的目标对象方法作为参数传入
     */
    public Object getProxyInstance(){
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("JDK动态代理开始");
                //通过反射机制调用目标对象的方法
                Object returnResult = method.invoke(target, args);
                System.out.println("JDK动态代理结束");
                return returnResult;
            }
        });
    }

}

The final test category and results:

public class TeacherTest002 {
    public static void main(String[] args) {
        //创建一个目标对象
        TeacherDao teacherDao = new TeacherDao();

        //给目标对象创建代理对象
        ProxyFactory proxyFactory = new ProxyFactory(teacherDao);
        ITTeacherDao proxyTeacherDao = (ITTeacherDao) proxyFactory.getProxyInstance();

        //通过代理对象,调用目标对象的方法
        proxyTeacherDao.teach();
    }
}


输出的结果如下:
JDK动态代理开始
老师正在讲课
JDK动态代理结束

 

 

Guess you like

Origin blog.csdn.net/LB_Captain/article/details/113959120