需求背景:
需要写3个定时任务,分别调用3个http接口获取数据,处理业务逻辑。显而易见,这3个定时任务,工作流程大致是一样的,主要区别是http链接和具体的业务处理逻辑不一样。封装一个抽象的模板类,把相同的工作流程封装起来。
代码实现:
模板类:
import java.util.ArrayList;
import java.util.List;
/**
* Created by ho on 2018/12/9.
*/
public abstract class Base<T> {
/**
* 每页的条数
*/
private int pageSize = 50;
/**
* 入参url
*/
public String url;
/**
* 初始化url等参数
*/
abstract void init();
/**
* 业务处理
* @param list
*/
abstract void dealBusiness(List<T> list);
/**
*
* @throws Exception
*/
public void execute() throws Exception{
// 校验
if(url == null || url.length() == 0){
throw new Exception("查询链接不能为空!!");
}
// 查询结果
List<T> list = null;
do {
list = queryByUrl(url);
dealBusiness(list);
}while(list != null && list.size() >= pageSize);
}
/**
* 具体的http查询,并把结果转出对应实体
* @param url
* @return
*/
private List<T> queryByUrl(String url){
return new ArrayList<>();
}
}
实现类
import java.util.List;
/**
* Created by ho on 2018/12/9.
*/
public class A extends Base{
@Override
void init() {
super.url = "XXXXXX";
}
@Override
void dealBusiness(List list) {
System.out.println("处理A业务逻辑");
}
}
总结:
模板方法,针对大部分流程一致,少部分差异的场景使用。差异的部分定义成抽象方法,留给子类实现。
凡是重复写的代码,可以考虑使用设计模式优化~