结构性盈利模式 (动态代理设计模式)

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。

举个例子:你要买车,钱是你出。但是你出钱还得去4s店,还得上牌才能开回家,那么来个兔子(代劳的第三方),他帮你跑4s店,帮你去上牌,你出钱就行。你也省事了。只不过你要多出钱。这个兔子就是你的代理对象。

public interface BuyCar {

    void buyCar();
}
/**
 * 接口实现类
 */
public class BuyCarImpl implements BuyCar{
    @Override
    public void buyCar() {
        System.out.println("买一辆宝马");
    }
}

/**
 * 代理对象
 */
public class BuyCarProxy implements BuyCar {

    private BuyCar buyCar;

    public BuyCarProxy(BuyCar buyCar) {
        this.buyCar = buyCar;
    }

    @Override
    public void buyCar() {
        System.out.println("去武汉白沙洲大市场");//前置操作
        buyCar.buyCar();
        System.out.println("上牌开回家");//后置操作
    }
}
public class ProxyDemo {

    public static void main(String[] args) {

        /**
         * 创建型模式 - 代理模式(静态代理 ,动态代理)
         */

        /**
         * 静态代理
         * 1.有公共的接口方法
         * 2.有具体的对应的实现类 BuyCarImpl
         * 3.有代理类(针对接口的实现 有对象针对性) 代理类里要注入对应的实现类  实现类做事  代理类也做事
         */
        BuyCar buyCar = new BuyCarImpl();
        BuyCarProxy buyCarProxy = new BuyCarProxy(buyCar);
        buyCarProxy.buyCar();
      

        /**
         * 动态代理 (JDK自带)
         * 1.有公共的接口方法
         * 2.有具体的对应的实现类 BuyCarImpl
         * 3.动态处理器(针对所有需要代理的对象) 添加一些需要代理的对象的公共操作
         */
        BuyCar dynamicBuyCar = new BuyCarImpl();
        //Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

        //代理对象是 对应接口的实现类
        Object o = Proxy.newProxyInstance(DynamicProxyHandler.class.getClassLoader(), new Class[]{BuyCar.class}, new DynamicProxyHandler(dynamicBuyCar));
        ((BuyCar) o).buyCar();

    }
}
package com.wangguo.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class DynamicProxyHandler implements InvocationHandler {

    /**
     * 被代理对象
     */
    private Object object;

    public DynamicProxyHandler(Object object) {
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println("去武汉白沙洲大市场");//前置操作
        //被代理对象处理
        Object invoke = method.invoke(object, args);
        System.out.println("上牌开回家");//后置操作
        return invoke;
    }
}