美文网首页
代理模式

代理模式

作者: CodeYang | 来源:发表于2021-09-12 14:32 被阅读0次

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

    组成

    • 抽象角色:声明真实角色实现的业务方法。
    • 代理角色:代理真实角色,并且可以附加行为
    • 真实角色:定义真实角色所要实现的业务逻辑,供代理角色调用。

    静态代理

    /**
     * 静态代理
     */
    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("大男孩");
        }
    }
    
    

    相关文章

      网友评论

          本文标题:代理模式

          本文链接:https://www.haomeiwen.com/subject/fnlxbltx.html