打字猴:1.700448285e+09
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
1700448324 Jerry=new DecorateAnimal(Jerry, FlyFeature.class);
1700448325
1700448326 //Jerry增加挖掘能力
1700448327
1700448328 Jerry=new DecorateAnimal(Jerry, DigFeature.class);
1700448329
1700448330 //Jerry开始耍猫了
1700448331
1700448332 Jerry.doStuff();
1700448333
1700448334 }
[ 上一页 ]  [ :1.700448285e+09 ]  [ 下一页 ]