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