发表于: 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
评论