構造型モード----代理モード


簡単なシーンを使用して、プロキシモードを説明します.
  1.お客様はアディダスの靴を買って、元のメーカーを探して買わないで、2つの商人を探して買って、2つの商人は1つの代理店です
  2.エージェントは最終的に顧客が手に入れたもの--靴を変えない
  3.二道商人も靴の値段で売ることはありません.彼は靴の元の価格情報を遮断して、自分の価格であなたに売っています.
 
  直接コードを付けて、コードの中で3種類のエージェント方式を実現しました:①静的②jdk動態③cglib
  ここでcglibの方式はpom依存を導入する必要がある:

    cglib
    cglib
    3.3.0

  コードは次のように書かれており、1つのクラスに書かれています.
package com.haopan.proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyTest {
    public static void main(String[] args) {
        System.out.println("    :");
        System.out.println("    :         ,   : " + AdidasFactoryProxy.getInstance().getStaticProxyCost() + "$");
        System.out.println();
        System.out.println("    :");
        System.out.println("JDK    :         ,   : " + AdidasFactoryProxy.getInstance().getJdkProxyCost() + "$");
        System.out.println();
        System.out.println("CgLib  :");
        System.out.println("CGLib  :         ,   : " + AdidasFactoryProxy.getInstance().getCgLibProxyCost() + "$");
    }
}

/**
 *         
 */
interface IAdidasFactory {
    /**
     *          
     */
    int cost();
}

/**
 *         
 */
class AdidasFactory implements IAdidasFactory {
    @Override
    public int cost() {
        System.out.println("    ,     1000$.");
        return 1000;
    }
}

/**
 *           
 */
class AdidasFactoryProxy {

    //         start
    private static final AdidasFactoryProxy INSTANCE = new AdidasFactoryProxy();
    private AdidasFactoryProxy() {
    }
    public static AdidasFactoryProxy getInstance() {
        return AdidasFactoryProxy.INSTANCE;
    }
    //         end

    /**
     *     :          
     * @return
     */
    public int getStaticProxyCost() {
        final IAdidasFactory target = new AdidasFactory();
        System.out.println("      ------ ");
        int returnValue = target.cost();
        System.out.println("      ------ ,     100$     .");
        return returnValue + 100;
    }

    /**
     *     :                  
     * @return
     */
    public int getJdkProxyCost() {
        final IAdidasFactory target = new AdidasFactory();
        IAdidasFactory target2 = (IAdidasFactory) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                (proxy, method, args) -> {
                    System.out.println("      ------ ");
                    Object returnValue = method.invoke(target, args);
                    System.out.println("      ------ ,     100$     .");
                    return (int) returnValue + 100;
                });
        return target2.cost();
    }

    /**
     * CGLib  :                 
     * @return
     */
    public int getCgLibProxyCost() {
        IAdidasFactory target = new AdidasFactory();
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object object, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("CgLib    ------ ");
                // invokeSuper:         object  ,
                // Object returnValue = methodProxy.invokeSuper(object, objects);
                // invoke:          target
                Object returnValue = methodProxy.invoke(target, objects);
                System.out.println("CgLib    ------ ,     100$     .");
                return (int) returnValue + 100;
            }
        });
        IAdidasFactory enhancerProxy = (IAdidasFactory) enhancer.create();
        return enhancerProxy.cost();
    }
}