打字猴:1.700448291e+09
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 }
1700448335
1700448336 此类代码是一个比较通用的装饰模式,只需要定义被装饰的类及装饰类即可,装饰行为由动态代理实现,实现了对装饰类和被装饰类的完全解耦,提供了系统的扩展性。
1700448337
1700448338
1700448339
1700448340
[ 上一页 ]  [ :1.700448291e+09 ]  [ 下一页 ]