zoukankan      html  css  js  c++  java
  • 代理模式

    # 静态代理

    public class QQ {
    
        public static void main(String[] args) throws ParseException {
            Subject realSubject = new RealSubject();
            ProxyObj proxyObj = new ProxyObj(realSubject);
            System.out.println(proxyObj.sellBook());
            System.out.println(proxyObj.speak());
        }
    
    }
    
    interface Subject {
        int sellBook();
    
        String speak();
    }
    
    class RealSubject implements Subject {
    
        public int sellBook() {
            System.out.println("selling book");
            return 1;
        }
    
        public String speak() {
            System.out.println("qq speaking");
            return "qq";
        }
    
    }
    
    class ProxyObj implements Subject {
    
        Subject sbj;
    
        public ProxyObj(Subject sbj) {
            this.sbj = sbj;
        }
    
        public int sellBook() {
            System.out.println("do something before sell book");
            int temp = sbj.sellBook();
            System.out.println("do something after sell book");
            return temp;
        }
    
        public String speak() {
            return sbj.speak();
        }
    
    }

    # 动态代理 - jdk

    public class QQ {
    
        public static void main(String[] args) throws ParseException {
            final Subject realSubject = new RealSubject();
    
            Subject proxyObj = (Subject) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),
                    new Class[] { Subject.class }, new InvocationHandler() {
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            System.out.println("do something before invoke method");
                            Object reObj = method.invoke(realSubject, args);
                            System.out.println("do something after invoke method");
                            return reObj;
                        }
                    });
    
    //        Subject proxyObj = (Subject) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),
    //                new Class[] { Subject.class }, new MyInvocationHandler(realSubject));
            System.out.println(proxyObj.sellBook());
            System.out.println(proxyObj.speak());
        }
    
    }
    
    interface Subject {
        int sellBook();
    
        String speak();
    }
    
    class RealSubject implements Subject {
    
        public int sellBook() {
            System.out.println("selling book");
            return 1;
        }
    
        public String speak() {
            System.out.println("qq speaking");
            return "qq";
        }
    
    }
    
    class MyInvocationHandler implements InvocationHandler {
    
        Object obj;
    
        public MyInvocationHandler(Object obj) {
            this.obj = obj;
        }
    
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            return method.invoke(obj, args);
        }
    
    }

    * 需要注意的地方

    1. 如果使用匿名内部类,则被代理类需要使用final修饰

    # 动态代理 - cglib

    public class QQ {
    
        public static void main(String[] args) throws ParseException {
            RealSubjectt realSubject = (RealSubjectt) CglibProxy.getProxy(new RealSubjectt());
            System.out.println(realSubject.sellBook());
            System.out.println(realSubject.speak());
        }
    }
    
    class RealSubjectt {
    
        public int sellBook() {
            System.out.println("selling book");
            return 1;
        }
    
        public String speak() {
            System.out.println("qq speaking");
            return "qq";
        }
    
    }
    
    class CglibProxy implements MethodInterceptor {
    
        private Object target;
    
        public CglibProxy(Object target) {
            this.target = target;
        }
    
        public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
            System.out.println("do something before " + arg1.getName());
            Object result = arg1.invoke(target, arg2);
            System.out.println("do somethind after " + arg1.getName());
            return result;
        }
    
        public static Object getProxy(Object target) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(target.getClass());
            enhancer.setCallback(new CglibProxy(target));
            return enhancer.create();
        }
    }
  • 相关阅读:
    6. Flask请求和响应
    5. Flask模板
    FW:Software Testing
    What is the difference between modified duration, effective duration and duration?
    How to push master to QA branch in GIT
    FTPS Firewall
    Query performance optimization of Vertica
    (Forward)5 Public Speaking Tips That'll Prepare You for Any Interview
    (转)The remote certificate is invalid according to the validation procedure
    Change
  • 原文地址:https://www.cnblogs.com/lwmp/p/10716201.html
Copyright © 2011-2022 走看看