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 ]
[
下一页 ]