首先新建一个父类抽象类AbsPopulator:可以默认去执行一些特定的子类的方法
package com.licq.template;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public abstract class AbsPopulator {
//获取所有的public方法
public final void dataInitialing()throws Exception{
doInit();
Method[] methods = getClass().getMethods();
if(null != methods && methods.length >0){
for(Method m:methods){
//判断是否根据数据初始化
if(isInitDataMethod(m)){
m.invoke(this);
}
}
}
}
//判断是否是数据初始化方法,基本方法鉴别器
private boolean isInitDataMethod(Method m) {
return m.getName().startsWith("init")//是否是init开始
&&Modifier.isPublic(m.getModifiers())//是否是public的
&&Void.TYPE.equals(m.getReturnType())//返回值是否是void
&&!m.isVarArgs()//输入参数是否为空
&&!Modifier.isAbstract(m.getModifiers());//方法不能为抽象的
}
public abstract void doInit()throws Exception;
}
然后实现一个子类Populator实现AbsPopulator类:
package com.licq.template;
public class Populator extends AbsPopulator {
public void initUser() {
// TODO Auto-generated method stub
System.out.println("----初始用户表信息----");
}
public void initPassword() {
// TODO Auto-generated method stub
System.out.println("-------初始化密码----------");
}
public void initJobs() {
// TODO Auto-generated method stub
System.out.println("----------初始化工作任务--------------");
}
@Override
public void doInit() throws Exception {
// TODO Auto-generated method stub
System.out.println("----------初始化开始了--------------");
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
AbsPopulator ap = new Populator();
ap.dataInitialing();
System.out.println("----------执行完成了--------------");
}
}
运行结果:
----------初始化开始了--------------
----初始用户表信息----
-------初始化密码----------
----------初始化工作任务--------------
----------执行完成了--------------
AbsPopulator类作为一个模板提供给消费者的话,他的子类可以按照里面声明定义很多自己的方法逻辑,真的很强大。但是代码却是很简练,无需很多重复代码,这也是非常符合我们的OCP原则。
本文的同步更新博客:模板模式的代码实现demo---海派Dubbo