代理模式

2021-09-12  本文已影响0人  CodeYang

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

组成

静态代理

/**
 * 静态代理
 */
public class Test {

    public static void main(String[] args) {
        new T01Proxy(new T01()).say();
    }

    /**
     * 代理
     */
    static class T01Proxy implements TInterFace{
        private TInterFace t;
        public T01Proxy(TInterFace t){
            this.t = t;
        }

        @Override
        public void say() {
            System.out.println("前置处理");
            t.say();
            System.out.println("后置处理");
        }
    }

    /**
     * 被代理对象
     */
    static class  T01 implements TInterFace {
        @Override
        public void say() {
            System.out.println("T01 say .......");
        }
    }


    interface TInterFace {
        void say();
    }
}

JDK动态代理类示例

public class MyJdkInvocationHandler implements InvocationHandler {

    //被代理对象
    private Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

    /**
     *
     * @param proxy 代理类对象
     * @param method 被代理执行的方法
     * @param args  目标方法参数
     * @return 防止执行的返回值
     * @throws Throwable
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("日志收集中...");
        Object result= method.invoke(target,args);
        System.out.println("日志收集结束...");
        return result;
    }

    public <T> T getProxy(){
        return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                this);
    }
}


public class TestMain {

    public static void main(String[] args) {
        MyJdkInvocationHandler proxy = new MyJdkInvocationHandler();
        proxy.setTarget(new TestServiceImpl());
        TestService testService = proxy.getProxy();
        testService.read("小小孩");
        testService.write("大男孩");
    }
}

Cjlib动态代理类示例

public class TestMain {public class MyCjlibIProxy implements MethodInterceptor {

    //被代理对象
    private Object target;

    public Object getInstance(Object target) {
        this.target = target;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(this.target.getClass());
        // 设置回调方法
        enhancer.setCallback(this);
        // 创建代理对象
        return enhancer.create();
    }

    public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("日志收集中。。。");
        Object result = proxy.invokeSuper(object, args);
        System.out.println("日志收集结束。。。");
        return result;

    }
}

public class TestMain {
    private static void  testCjlibProxy(){
        MyCjlibIProxy proxy = new MyCjlibIProxy();
        TestService testService = (TestService)proxy.getInstance(new TestServiceImpl());
        testService.read("小小孩");
        testService.write("大男孩");
    }
}

上一篇下一篇

猜你喜欢

热点阅读