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