发表于: 2017-12-07 22:26:14

1 886


今天完成的事情:




代理模式中,会有代理对象,和被代理对象(目标业务对象)。代理对象会拦截对目标业务对象的访问。类似于现实中的明星和经纪人。






/*

* 演示:代理模式

* 代理:代理对象主要用来拦截目标业务对象(被代理对象)的访问。

*  A:代理对象要持有真实业务对象。(通过构造函数接收业务对象,并用成员变量记录)

*  B:代理对象要和真实业务对象,具备相同的行为方法(实现相同接口)

*  C:代理对象拦截对真实对象的访问,可以修改访问的参数、返回值,甚至拦截访问

* 代理模式与装饰模式区别

*  A:代理模式侧重与拦截,装饰模式侧重与加强

*  B:Java中自带的代理中,只能对接口进行代理。装饰只需要与被装饰类有共同父类。

*/


下面动态代理

/*

* 演示:动态代理

* 动态代理:在程序运行过程中产生的一个代理对象

* 在程序运行的过程中,动态在内存中生成一个类,代理需要被代理的目标对象,并且生成这个代理类的对象。

* Java如何凭空生成一个代理类,并且代理黄渤的呢?我们要查看一个API:

*  static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

*   ClassLoader loader :类加载器,一般用被代理对象的类加载器

*   Class[] interfaces : 被代理对象的接口的Class对象数组,Class<?>[] getInterfaces()

*   InvocationHandler h : 调用处理器

*/

public class ProxyDemo02 {

public static void main(String[] args) {

// 创建被代理对象

final HuangBo huangBo = new HuangBo();

// 先准备动态代理的三大参数

// 被代理类的类加载器

ClassLoader loader =huangBo .getClass().getClassLoader();

// 被代理对象的接口的Class对象数组

Class<?>[] interfaces =huangBo .getClass().getInterfaces();

//huangBo .getClass().getInterfaces();{SuperStar.class}

// 调用处理器

InvocationHandler h = new InvocationHandler(){

// 当我们调用代理对象的功能时,代理对象,其实都来调用了处理器中的invoke功能

// 因此,我们需要在invoke中写拦截的逻辑!

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

// Object proxy : 是代理对象本身

// Method method :当前正在被调用的真实方法的对象

// Object[] args : 当前正在被调用的真实方法的真实参数

String name = method.getName();

// 判断方法的名称,做出不同的拦截逻辑

if( "sing".equals(name) || "liveShow".equals(name)){

double money = (double) args[0];

double min = "sing".equals(name) ? 100000 : 500000;

if (money < min) {

System.out.println("钱太少,不去");

return null;

}

System.out.println("A抽取" + money * 0.6 + "提成");

return method.invoke(huangBo, money * 0.4);

}

return method.invoke(huangBo, args);

}

};


// static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

SuperStar p = (SuperStar) Proxy.newProxyInstance(loader, interfaces, h);


p.sing(100);


p.liveShow(1000000);


p.sleep();

}

}



明天的计划:小课堂   复盘


遇到的问题:AOP的思想都懂  就是实现起来确实有的繁琐


收获:SpringAOP



返回列表 返回列表
评论

    分享到