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();
        }
    }
  • 相关阅读:
    详解Java API之正则表达式
    ios UIWindow 错误使用导致无法接收motionEnded(摇一摇)函数
    ios NSTimer的强引用问题
    ionic 接触的第一个Hybrid项目
    iOS 小经验:UIAnimation空对象导致crash
    iOS GCD 必读推荐,有关于单例使用问题
    ios NSString 转 float的注意
    iOS UIViewController 和 nib 相关的3个方法
    ios delegate 使用注意 assign,weak
    ios 使用autolayout 后button 的frame 无法设置问题!
  • 原文地址:https://www.cnblogs.com/lwmp/p/10716201.html
Copyright © 2011-2022 走看看