• 代理模式


    环境:QQ类继承Car类

    需求:对QQ的run方法加强

    Car 类

    package proxy;
    
    public interface Car {
        
        public void run();
        
        public void stop();
        
    }

    QQ类

    package proxy;
    
    public class QQ implements Car {
    
        @Override
        public void run() {
            System.out.println("qq开车");
        }
    
        @Override
        public void stop() {
            System.out.println("qq停车");
        }
    
    }

    实现:使用代理对run方法加强

    1、静态代理

    package proxy;
    
    /**
     * 
     * 静态代理使用装饰着模式实现
     * 
     * 分析:
     * A.要求被装饰者和装饰者实现同一个接口或者继承同一个类
     * B.在装饰者中要有被装饰者的引用
     * C.对需要加强的方法进行加强
     * D.对不需要加强的方法调用原来的方法
     *
     * @author 61423
     *
     */
    public class QQStaticProxy implements Car{
        QQ qq = new QQ();
        
        @Override
        public void run() {
            System.out.println("QQ加油");
            qq.run();
            System.out.println("QQ加速");
        }
    
        @Override
        public void stop() {
            qq.stop();
        }
        
        public static void main(String[] args) {
            QQStaticProxy qqStaticProxy = new QQStaticProxy();
            qqStaticProxy.run();
        }
    }

    2、动态代理

    package proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /**
     * 
     * 动态代理: 程序运行的时候创建实例,对被代理对象进行加强
     *         1、jdk中Proxy类,前提:实现InvocationHandler接口
     *         2、spring中cglib,前提:继承类
     *
     * Object Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 
     *            参数说明:
     *                ClassLoader:代理对象类加载器         一般我们使用的是被代理对象的类加载器
     *                Class[]:代理对象需要实现接口         一般我们使用的是被代理对象所实现的所有接口
     *            InvocationHandler:执行处理类.在这里面对方法进行加强
     *
     *            invocationHandler中只有一个方法
     *                Object invoke(Object proxy, Method method, Object[] args) 
     *                    参数说明:
     *                        proxy:代理对象
     *                        method:当前执行的方法
     *                        args:当前方法执行的时候所需要的参数
     *                        返回值:就是当前method对象执行的返回值
     *实现步骤:
     *    A:调用Proxy.newProxyInstance();
     *  B:实现InvocationHandler接口,在该接口中强化被代理对象的方法
     * 
     * @author 61423
     *
     */
    public class QQProxy {
        public static void main(String[] args) {
            QQ qq = new QQ();
            
            // QQ的代理的对象
            Car qqProxy = (Car)Proxy.newProxyInstance(QQ.class.getClassLoader(), new Class [] {Car.class}, new InvocationHandler() {
                
                /**
                 * 相当于被代理的方法,返回被代理的方法返回的值
                 */
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    
                    // 仅对QQ的run方法进行代理
                    if("run".equals(method.getName())) {
                        System.out.println("充氮气");
                        Object obj = method.invoke(qq, args);
                        System.out.println("加速");
                        return obj;
                    }
                    
                    return method.invoke(qq, args);
                }
            });
            
            qqProxy.run();
            // qqProxy.stop();
            
        }
    }
  • 相关阅读:
    数学思想方法-python计算战(8)-机器视觉-二值化
    04-05组合问题_算法训练
    至HDFS附加内容
    HDU 1010 Tempter of the Bone heuristic 修剪
    二叉树3种遍历的非递归算法
    [Ramda] R.project -- Select a Subset of Properties from a Collection of Objects in Ramda
    [Ramda] Refactor a Promise Chain to Function Composition using Ramda
    [SVG] Combine Multiple SVGs into an SVG Sprite
    [Ramda] Difference between R.converge and R.useWith
    [Ramda] Refactor to a Point Free Function with Ramda's useWith Function
  • 原文地址:https://www.cnblogs.com/smartmsl/p/12132032.html
Copyright © 2020-2023  润新知