1700448411
1700448412
return m.getName().startsWith(“init”)//init开始
1700448413
1700448414
&&Modifer.isPublic(m.getModifers())//公开方法
1700448415
1700448416
&&m.getReturnType().equals(Void.TYPE)//返回值是void
1700448417
1700448418
&&!m.isVarArgs()//输入参数为空
1700448419
1700448420
&&!Modifer.isAbstract(m.getModifers());//不能是抽象方法
1700448421
1700448422
}
1700448423
1700448424
}
1700448425
1700448426
在一般的模板方法模式中,抽象模板(这里是AbsPopulator类)需要定义一系列的基本方法,一般都是protected访问级别的,并且是抽象方法,这标志着子类必须实现这些基本方法,这对子类来说既是一个约束也是一个负担。但是使用了反射后,不需要定义任何抽象方法,只需定义一个基本方法鉴别器(例子中isInitDataMethod)即可加载符合规则的基本方法。鉴别器在此处的作用是鉴别子类方法中哪些是基本方法,模板方法(例子中的dataInitialing)则根据基本方法鉴别器返回的结果通过反射执行相应的方法。
1700448427
1700448428
此时,如果需要进行大量的数据初始化工作,子类的实现就非常简单了,代码如下:
1700448429
1700448430
public class UserPopulator extends AbsPopulator{
1700448431
1700448432
public void initUser(){
1700448433
1700448434
/*初始化用户表,如创建、加载数据等*/
1700448435
1700448436
}
1700448437
1700448438
public void initPassword(){
1700448439
1700448440
/*初始化密码*/
1700448441
1700448442
}
1700448443
1700448444
public void initJobs(){
1700448445
1700448446
/*初始化工作任务*/
1700448447
1700448448
}
1700448449
1700448450
}
1700448451
1700448452
UserPopulator类中的方法只要符合基本方法鉴别器条件即会被模板方法调用,方法的数据量也不再受父类的约束,实现了子类灵活定义基本方法、父类批量调用的功能,并且缩减了子类的代码量。
1700448453
1700448454
如果读者熟悉JUnit的话,就会看出此处的实现与JUnit非常类似,JUnit4之前要求测试的方法名必须是以test开头的,并且无返回值、无参数,而且有public修饰,其实现的原理与此非常相似,读者有兴趣可以看看JUnit的源代码。
1700448455
1700448456
注意 决定使用模板方法模式时,请尝试使用反射方式实现,它会让你的程序更灵活、更强大。
1700448457
1700448458
1700448459
1700448460
[
上一页 ]
[ :1.700448411e+09 ]
[
下一页 ]