1700461194
}
1700461195
1700461196
}
1700461197
1700461198
如此扩展以后,高层模块对代理的访问会更加简单,如代码清单12-32所示。
1700461199
1700461200
代码清单12-32 场景类
1700461201
1700461202
public class Client{
1700461203
1700461204
public static void main(String[]args){
1700461205
1700461206
//定义一个主题
1700461207
1700461208
Subject subject=new RealSubject();
1700461209
1700461210
//定义主题的代理
1700461211
1700461212
Subject proxy=SubjectDynamicProxy.newProxyInstance(subject);
1700461213
1700461214
//代理的行为
1700461215
1700461216
proxy.doSomething(“Finish”);
1700461217
1700461218
}
1700461219
1700461220
}
1700461221
1700461222
是不是更加简单了?可能读者就要提问了,这样与静态代理还有什么区别?都是需要实现一个代理类,有区别,注意看父类,动态代理的主要意图就是解决我们常说的“审计”问题,也就是横切面编程,在不改变我们已有代码结构的情况下增强或控制对象的行为。
1700461223
1700461224
注意 要实现动态代理的首要条件是:被代理类必须实现一个接口,回想一下前面的分析吧。当然了,现在也有很多技术如CGLIB可以实现不需要接口也可以实现动态代理的方式。
1700461225
1700461226
再次说明,以上的动态代理是一个通用代理框架。如果你想设计自己的AOP框架,完全可以在此基础上扩展,我们设计的是一个通用代理,只要有一个接口,一个实现类,就可以使用该代理,完成代理的所有功效。
1700461227
1700461228
1700461229
1700461230
1700461232
设计模式之禅 12.5 最佳实践
1700461233
1700461234
代理模式应用得非常广泛,大到一个系统框架、企业平台,小到代码片段、事务处理,稍不留意就用到代理模式。可能该模式是大家接触最多的模式,而且有了AOP大家写代理就更加简单了,有类似Spring AOP和AspectJ这样非常优秀的工具,拿来主义即可!不过,大家可以看看源代码,特别是调试时,只要看到类似$Proxy0这样的结构,你就应该知道这是一个动态代理了。
1700461235
1700461236
友情提醒,在学习AOP框架时,弄清楚几个名词就成:切面(Aspect)、切入点(JoinPoint)、通知(Advice)、织入(Weave)就足够了,理解了这几个名词,应用时你就可以游刃有余了!
1700461237
1700461238
1700461239
1700461240
1700461242
设计模式之禅 第13章 原型模式
1700461243
[
上一页 ]
[ :1.700461194e+09 ]
[
下一页 ]