@Override
public Option getTrafficChartOption(String type, ReportType reportType, Integer deviceId, Integer direction) {
Integer device = deviceId + 1010000;
List<ChartData> data = chartDao.getTrafficChartData(reportType,device,direction);
String title = Titlehelper.getChartTitle(reportType);
String subtitle = Titlehelper.gettrafficSubText(reportType.getReportTime(),deviceId,direction);
Option option = new Option();
switch (type){
case "bar":
option = BarOption.BarOptionBuiler(title, subtitle, data);
break;
case "line":
option = LineOption.OptionBuilerhelp(title, subtitle, data);
break;
case "pie":
option = PieOption.PieOptionbuilder(title, subtitle, data);
break;
}
return option;
}
@Override
public Option getAmmeterChartOption(String type, ReportType reportType, Integer deviceId) {
List<ChartData> data = chartDao.getAmmeterDataChartData(reportType,deviceId);
String title = Titlehelper.getChartTitle(reportType);
String subtitle = Titlehelper.gettrafficSubText(reportType.getReportTime(),deviceId,1);
Option option = new Option();
switch (type){
case "bar":
option = BarOption.BarOptionBuiler(title, subtitle, data);
break;
case "line":
option = LineOption.OptionBuilerhelp(title, subtitle, data);
break;
case "pie":
option = PieOption.PieOptionbuilder(title, subtitle, data);
break;
}
return option;
}
程式碼結構非常相似,只是dao層取資料不一樣,另外這個switch有沒有改進空間,我知道使用eumn來枚舉,沒寫以減少無關程式碼
學習是最好的投資!
你的程式碼是要建立Option類,適合使用工廠方法重構。
//方法參數(shù)盡量少于3個,3個以上時建議使用組合對象
class OptionParam {
private String type;
private ReportType reportType;
private Integer piceId;
private Integer direction;
//getter and setter
}
//Option抽象工廠,每個具體工廠都必須繼承自抽象工廠
public abstract class AbstractOptionFactory {
@Autowired
ChartDao chartDao;
//希望具體工廠實現(xiàn)的方法,交于具體工廠實現(xiàn)
abstract List<ChartData> getData(OptionParam optionParam);
abstract String getSubtitle(OptionParam optionParam);
//公共邏輯代碼,創(chuàng)建對象調用該方法
public Option create(OptionParam optionParam) {
assert optionParam != null;
assert optionParam.getReportType() != null;
String type = optionParam.getType();
List<ChartData> data = getData(optionParam);
String title = Titlehelper.getChartTitle(optionParam.getReportType());
String subtitle = getSubtitle(optionParam);
Option option = new Option();
switch (type) {
case "bar":
option = BarOption.BarOptionBuiler(title, subtitle, data);
break;
case "line":
option = LineOption.OptionBuilerhelp(title, subtitle, data);
break;
case "pie":
option = PieOption.PieOptionbuilder(title, subtitle, data);
break;
}
return option;
}
}
@Component
class TrafficChartOptionFactory extends AbstractOptionFactory {
@Override
List<ChartData> getData(OptionParam optionParam) {
return chartDao.getTrafficChartData(optionParam.getReportType(),
optionParam.getpiceId(),
optionParam.getDirection());
}
@Override
String getSubtitle(OptionParam optionParam) {
return Titlehelper.gettrafficSubText(
optionParam.getReportType().getReportTime(),
optionParam.getpiceId(),
optionParam.getDirection());
}
}
@Component
class AmmeterChartOptionFactory extends AbstractOptionFactory {
@Override
List<ChartData> getData(OptionParam optionParam) {
return chartDao.getAmmeterDataChartData(optionParam.getReportType(), optionParam.getpiceId());
}
@Override
String getSubtitle(OptionParam optionParam) {
return Titlehelper.gettrafficSubText(optionParam.getReportType().getReportTime(),
optionParam.getpiceId(),
1);
}
}
使用工廠方法的好處就不多說了,具體可以閱讀我的部落格
String title = Titlehelper.getChartTitle(reportType);
String subtitle = Titlehelper.gettrafficSubText(reportType.getReportTime(),deviceId,1);
Option option = new Option();
switch (type){
case "bar":
option = BarOption.BarOptionBuiler(title, subtitle, data);
break;
case "line":
option = LineOption.OptionBuilerhelp(title, subtitle, data);
break;
case "pie":
option = PieOption.PieOptionbuilder(title, subtitle, data);
break;
}
return option;
這幾行提取出來放在一個方法裡呼叫不就行了
可以試試看模板設計模式吧,將通用的演算法提取到父類別中,不同的地方交給子類別重寫。如果這樣的地方少些,還是提取一個公共方法,比較省事。