代理模式

1、接口
public interface ProxyMapper {

    String queryUserById(Long id);
}
2、目标对象
public class ProxyMapperTargetObject implements ProxyMapper{
    @Override
    public String queryUserById(Long id) {
        return "执行目标对象";
    }
}
3、代理对象
public class ProxyInvocationHandler implements InvocationHandler {

    // 目标对象/委托对象
    private Object target;

    public ProxyInvocationHandler(Object target) {
        this.target = target;
    }

    /**
     * @param proxy  : 代理对象
     * @param method : 目标对象的方法对象
     * @param args   : 目标对象的方法参数
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("执行目标对象的方法前");
        /**
         * 反射方式调用目标对象的方法
         * target : 目标对象
         * args : 目标对象的方法参数
         * result : 目标对象方法的执行结果
         */
        Object result = method.invoke(target, args);
        System.out.println(result);
        System.out.println("执行目标对象的方法后");
        return result;
    }
}
4、测试代码
public class ProxyService {

    public static void main(String[] args) {
        // 目标(委托)对象
        ProxyMapper targetObject = new ProxyMapperTargetObject();
        //
        ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler(targetObject);
        // 代理对象
        ProxyMapper mapperInstance = (ProxyMapper) Proxy.newProxyInstance(ProxyService.class.getClassLoader(),
                new Class[]{ProxyMapper.class},
                proxyInvocationHandler);

        mapperInstance.queryUserById(2L);
    }
}
5、代理执行顺序
mapperInstance.queryUserById(2L);

ProxyInvocationHandler#invoke()

ProxyMapperTargetObject#queryUserById()
posted @ 2024-01-05 16:49  jishaleng  阅读(3)  评论(0编辑  收藏  举报