1. 程式人生 > >設計模式(實戰)-模板模式

設計模式(實戰)-模板模式

一:模板模式說明

模式定義:定義一個操作中的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。

翻譯:說白了,父類中定義一些特定方法的實現,不能被子類修改,子類繼承父類,實現父類中抽象方法,呼叫特定方法獲取結果。

通用類圖如下:

AbstractClass定義了doAnything()和doSomething()為抽象方法,需要子類進行實現。而templateMethod()方法裡面可以定義doAnything()和doSomething()執行的順序或者進行任意操作

二:專案實戰

還不太懂,沒有關係,用實現專案進行說明

需求如下,前端需要展現Echarts圖表,後臺介面提供json資料物件。

Echarts官網截圖,json物件部分截圖

使用原因:在java中封裝圖表對應的json資料,資料組裝的過程比較複雜,故使用模板模式,複雜的資料組裝的過程在父類中實現對應的方法。

父類中定義獲取其它集合List的抽象方法,子類繼承父類只需要實現獲取其它簡單集合List的方法即可。

類圖如下:

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() ;

}

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);
	}


}

業務模板呼叫的程式碼如下:

public BarSimple getBarSimple(Map<String, Object> conditionMap) {
		AbstractBarSimple createBarSimple = echartsFactory.createBarSimple(conditionMap,BarSimpleImpl.class);
		return createBarSimple.initEchartsData();
	}

裡面用到了抽象工廠模式,可以忽略。

核心程式碼createLineSimple.initEchartsData()呼叫父類的方法即可獲取封裝好的json物件