模版方法模式
模版方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定的步骤。
特点
重复 = 易错+难改
模版方法模式是通过把不变的行为搬移到超类,移除雷小红重复代码来体现他的优势。
模版方法模式提供了一个很好用的代码复用平台。
当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,通过模版方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠错
构成
- 模版类:(抽象类,抽象模版),抽象行为+逻辑方法(或者叫模版方法)
其中包括:
一些抽象的行为,放到子类实现;
逻辑方法,给出逻辑的骨架,而逻辑的组成是由一些相应的抽象行为构成,他们的实现都将推迟到子类 - 子类继承模板类,实现父类的抽象行为
- 使用时:模版方法 对象= new 子类,对象调用逻辑方法
实现
父类(超类)
public abstract class Model {
protected abstract void init()throws Exception;
protected abstract void process()throws Exception;
protected abstract void close()throws Exception;
public void work()throws Exception{
init();
process();
close();
}
}
子类继承父类,实现父类抽象行为
public class WorkTask extends Model {
@Override
protected void init() throws Exception {
System.out.println("开始啦starting");
System.out.println("initing中");
System.out.println("start time :"+ new Date());
long timestart = System.currentTimeMillis();
oracleSelectCon = ConnectionPool.getInstance().getSaveConnection();
Statement statement = oracleSelectCon.createStatement();
ResultSet resultSet = statement.executeQuery(GROUP_SQL);
List<Future<Integer>> futureList = new ArrayList<>();
while (resultSet.next()){
TaskMain task = new TaskMain(resultSet.getString("orian"));
//taskMainList.add(task);
futureList.add( executor.submit(task));
}
System.out.println("分组完成,共:"+futureList.size());
for (Future<Integer> future : futureList) {
future.get();
}
resultSet.close();
statement.close();
//System.out.println("分组完成,共" + this.taskMainList.size()+"组");
System.out.println("end time :"+ new Date());
System.out.println("initing结束");
//System.out.println("加载数据花费时间:"+(System.currentTimeMillis()-timestart));
}
@Override
protected void process() throws Exception {
/*System.out.println("processing中");
long processStart = System.currentTimeMillis();
System.out.println("process start :"+ new Date());
*//* Stream<TaskMain> stream = taskMainList.parallelStream();
//stream.forEach(task -> task.run());
stream.close();*//*
long processEnd = System.currentTimeMillis();
System.out.println("process end :"+ new Date());
System.out.println("耗时: "+(processEnd-processStart) );*/
}
@Override
protected void close() throws Exception {
ConnectionPool.close();
HttpUtils.staticClose();
System.out.println("结束啦ending");
}
}
调用
public class App
{
public static void main(String[] args) throws Exception {
Model model = new WorkTask();
model.work();
}
}
知识点
抽象类:包含抽象方法的类称为抽象类。
抽象方法:只声明而未实现的方法称为抽象方法。必须使用abstract关键字声明。
*抽象类和抽象方法都必须使用abstract关键字声明。
*抽象方法只声明,不需要定义。
*抽象类不能声明对象,必须被继承。
*抽象类中的抽象方法必须被子类全部覆写才能够使用。
抽象类中的非抽象方法,子类是不能重写,但是可以同名函数覆盖父类的方法,或者子类也可以调用父类的非抽象方法。