代理模式

环境: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();
        
    }
}
原文地址:https://www.cnblogs.com/smartmsl/p/12132032.html