打字猴:1.700460831e+09
1700460831
1700460832 }
1700460833
1700460834 }
1700460835
1700460836 在需要的时候才初始化主题对象,可以避免被代理对象较多而引起的初始化缓慢的问题。其缺点是需要在每个方法中判断主题对象是否被创建,这就是虚拟代理,非常简单。
1700460837
1700460838
1700460839
1700460840
1700460841 设计模式之禅 12.4.5 动态代理
1700460842
1700460843 放在最后讲的一般都是压轴大戏,动态代理就是如此,上面的章节都是一个引子,动态代理才是重头戏。什么是动态代理?动态代理是在实现阶段不用关心代理谁,而在运行阶段才指定代理哪一个对象。相对来说,自己写代理类的方式就是静态代理。本章节的核心部分就在动态代理上,现在有一个非常流行的名称叫做面向横切面编程,也就是AOP(Aspect Oriented Programming),其核心就是采用了动态代理机制,既然这么重要,我们就来看看动态代理是如何实现的,还是以打游戏为例,类图修改一下以实现动态代理,如图12-7所示。
1700460844
1700460845
1700460846
1700460847
1700460848 图12-7 动态代理
1700460849
1700460850 在类图中增加了一个InvocationHanlder接口和GamePlayIH类,作用就是产生一个对象的代理对象,其中InvocationHanlder是JDK提供的动态代理接口,对被代理类的方法进行代理。我们来看程序,接口保持不变,实现类也没有变化,请参考代码清单12-1和代码清单12-2所示。我们来看DynamicProxy类,如代码清单12-22所示。
1700460851
1700460852 代码清单12-22 动态代理类
1700460853
1700460854 public class GamePlayIH implements InvocationHandler{
1700460855
1700460856 //被代理者
1700460857
1700460858 Class cls=null;
1700460859
1700460860 //被代理的实例
1700460861
1700460862 Object obj=null;
1700460863
1700460864 //我要代理谁
1700460865
1700460866 public GamePlayIH(Object_obj){
1700460867
1700460868 this.obj=_obj;
1700460869
1700460870 }
1700460871
1700460872 //调用被代理的方法
1700460873
1700460874 public Object invoke(Object proxy,Method method,Object[]args)
1700460875
1700460876 throws Throwable{
1700460877
1700460878 Object result=method.invoke(this.obj,args);
1700460879
1700460880 return result;
[ 上一页 ]  [ :1.700460831e+09 ]  [ 下一页 ]