一:模板模式说明
模式定义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
翻译:说白了,父类中定义一些特定方法的实现,不能被子类修改,子类继承父类,实现父类中抽象方法,调用特定方法获取结果。
通用类图如下:
AbstractClass定义了doAnything()和doSomething()为抽象方法,需要子类进行实现。而templateMethod()方法里面可以定义doAnything()和doSomething()执行的顺序或者进行任意操作
二:项目实战
还不太懂,没有关系,用实现项目进行说明
需求如下,前端需要展现Echarts图表,后台接口提供json数据对象。
Echarts官网截图,json对象部分截图,如图所见,有三类数据查询(legend集合,xAxis集合,series集合),再进行组装
使用原因:在java中封装图表对应的json数据,数据组装的过程比较复杂,故使用模板模式,复杂的数据组装的过程在父类中实现对应的方法。
父类中定义获取其它集合List的抽象方法,子类继承父类只需要实现获取其它简单集合(legend集合,xAxis集合,series集合)的方法即可。
类图如下:
AbstractBarSimple定义了getLegendList()和ListXYAxis()为抽象方法分别为Echarts中的legend参数获取和X轴和Y轴对应的List集合
BaseEchartsBean 定义了不同图表之前的公共方法setParameters设置参数,initEchartsData组装数据的过程。
核心类代码如下:
模板父类:AbstractBarSimple
package com.huajie.service.echarts;
import java.util.ArrayList;
import java.util.List;
import com.huajie.entity.echarts.BarSimple;
import com.huajie.entity.echarts.ExtMapData;
/**
* @author xiewenfeng
* 封装后台echarts 图表数据组合
* BarSimple柱状图
*/
public abstract class AbstractBarSimple extends BsaeEchartsBean<BarSimple>{
protected abstract List<String> getLegendList();
/**
* 获取data数据集
* name :x轴值集合
* value :对应的y轴值集合
* ExtMapData<name:value> 的List集合形式
* @return
*/
protected abstract List<ExtMapData<String, String>> ListXYAxis();
public BarSimple initEchartsData() {
BarSimple barSimple = new BarSimple();
List<String> legendList = getLegendList();
List<ExtMapData<String, String>> listData = ListXYAxis();
List<String> xAxisDataList = new ArrayList<String>();
List<Object> serieDataList = new ArrayList<Object>();
List<List<Object>> serieDataListSum = new ArrayList<List<Object>>();
for (ExtMapData<String, String> extMapData : listData) {
xAxisDataList.add(String.valueOf(extMapData.getName()));
serieDataList.add(String.valueOf(extMapData.getValue()));
}
barSimple.setLegendData(legendList);
barSimple.setXAxisData(xAxisDataList);
serieDataListSum.add(serieDataList);
barSimple.setSeriesData(serieDataListSum);
return barSimple;
}
}
公共的父类抽象 BsaeEchartsBean:
package com.huajie.service.echarts;
import java.util.Map;
/**
* @author xiewenfeng
*/
public abstract class BsaeEchartsBean<T>{
protected Map<String, Object> parameters;
protected abstract void setParameters(Map<String, Object> parameters);
protected abstract T initEchartsData() ;
}
实现AbstractBarSimple的子类 BarSimpleImpl:
package com.huajie.service.impl.echarts.LeadergroupTotalAnalysis;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.huajie.entity.echarts.ExtMapData;
import com.huajie.mapper.report.LeadergroupTotalAnalysisMapper;
import com.huajie.service.echarts.AbstractBarSimple;
/**
* @author xiewenfeng 柱状图
*/
@Service
public class BarSimpleImpl extends AbstractBarSimple {
@Autowired
private LeadergroupTotalAnalysisMapper leadergroupTotalAnalysisMapper;
@Override
protected void setParameters(Map<String, Object> parameters) {
super.parameters = parameters;
}
@Override
protected List<String> getLegendList() {
List<String> legendList = new ArrayList<String>();
legendList.add("分数");
return legendList;
}
@Override
protected List<ExtMapData<String, String>> ListXYAxis() {
return leadergroupTotalAnalysisMapper.getLeadergroupQuotaDistribute(parameters);
}
}
Echarts JavaBean对象
package com.huajie.entity.echarts;
import java.util.List;
import lombok.Data;
/**
* @author xiewenfeng
* echarts普通柱状图
*/
@Data
public class BarSimple {
//legend中data的数据
private List<String> legendData;
private List<String> xAxisData;
private List<String> yAxisData;
private List<List<Object>> seriesData;
}
业务模板调用的代码如下:
public BarSimple getBarSimple(Map<String, Object> conditionMap) {
AbstractBarSimple createBarSimple = echartsFactory.createBarSimple(conditionMap,BarSimpleImpl.class);
return createBarSimple.initEchartsData();
}
以上代码用到了抽象工厂模式,和本模式无关可以忽略,在下一篇抽象工厂模式实战文章中会详细说明。
说明:子类BarSimpleImpl 实现了父类BsaeEchartsBean模板中的抽象方法,核心代码》createLineSimple.initEchartsData()《调用父类的方法即可获取封装好的json对象,而我们不必了解数据组装的过程。
对此工具类的封装意义在于,其他人使用此工具类时,可以不用关心组装对象的过程,开发人员专心在业务sql代码实现即可。
类图中的如下位置可以进行扩展