打字猴:1.700448274e+09
1700448274 public Object invoke(Object p, Method m, Object[]args)throws
1700448275
1700448276 Throwable{
1700448277
1700448278 Object obj=null;
1700448279
1700448280 //设置包装条件
1700448281
1700448282 if(Modifier.isPublic(m.getModifiers())){
1700448283
1700448284 obj=m.invoke(clz.newInstance(),args);
1700448285
1700448286 }
1700448287
1700448288 animal.doStuff();
1700448289
1700448290 return obj;
1700448291
1700448292 }
1700448293
1700448294 };
1700448295
1700448296 //当前加载器
1700448297
1700448298 ClassLoader cl=getClass().getClassLoader();
1700448299
1700448300 //动态代理,由Handler决定如何包装
1700448301
1700448302 Feature proxy=(Feature)Proxy.newProxyInstance(cl, clz.
1700448303
1700448304 getInterfaces(),handler);
1700448305
1700448306 proxy.load();
1700448307
1700448308 }
1700448309
1700448310 }
1700448311
1700448312 注意看doStuff方法,一个装饰类型必然是抽象构建(Component)的子类型,它必须要实现doStuff,此处的doStuff方法委托给了动态代理执行,并且在动态代理的控制器Handler中还设置了决定装饰方式和行为的条件(即代码中InvocationHandler匿名类中的if判断语句),当然,此处也可以通过读取持久化数据的方式进行判断,这样就更加灵活了。
1700448313
1700448314 抽象构件有了,装饰类也有了,装饰动作类也完成了,那我们就可以编写客户端进行调用了,代码如下:
1700448315
1700448316 public static void main(String[]args)throws Exception{
1700448317
1700448318 //定义Jerry这只家喻户晓的老鼠
1700448319
1700448320 Animal Jerry=new Rat();
1700448321
1700448322 //为Jerry增加飞行能力
1700448323
[ 上一页 ]  [ :1.700448274e+09 ]  [ 下一页 ]