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
1700448342
编写高质量代码:改善Java程序的151个建议 建议108:反射让模板方法模式更强大
1700448343
1700448344
模板方法模式(Template Method Pattern)的定义是:定义一个操作中的算法骨架,将一些步骤延迟到子类中,使子类不改变一个算法的结构即可重定义该算法的某些特定步骤。简单地说,就是父类定义抽象模板作为骨架,其中包括基本方法(是由子类实现的方法,并且在模板方法被调用)和模板方法(实现对基本方法的调度,完成固定的逻辑),它使用了简单的继承和覆写机制,我们来看一个基本的例子。
1700448345
1700448346
我们经常会开发一些测试或演示程序,期望系统在启动时自行初始化,以方便测试或讲解,一般的做法是写一个SQL文件,在系统启动前手动导入,不过,这样不仅麻烦而且还容易出现错误,于是我们就自己动手写了一个初始化数据的框架:在系统(或容器)启动时自行初始化数据。但问题是每个应用程序要初始化的内容我们并不知道,只能由实现者自行编写,那我们就必须给作者预留接口,此时就得考虑使用模板方法模式了,代码如下:
1700448347
1700448348
public abstract class AbsPopulator{
1700448349
1700448350
//模板方法
1700448351
1700448352
public final void dataInitialing()throws Exception{
1700448353
1700448354
//调用基本方法
1700448355
1700448356
doInit();
1700448357
1700448358
}
1700448359
1700448360
//基本方法
[
上一页 ]
[ :1.700448311e+09 ]
[
下一页 ]