抽象父類的屬性設定
阿新 • • 發佈:2019-02-15
需求:異構資料入庫。資料來源可能有多個,每個資料來源的資料格式也都不一樣。
分析:step1資料採集->step2解析資料並拼成指定格式->step3將指定格式的資料入庫。從需求上看變化的部分是step1、step2;不變的部分是step3。
設計:採用模版模式。使用一個抽象父類,定義好對應的三個方法(grapData、parseData、execute)。其中grapData、parseData為抽象方法,execute為具體方法。
編碼如下。為減少依賴,使用的Logger為JDK自帶的Logger,整個程式碼都只依賴於JDK而不依賴其他jar包。
抽象父類:
子類:import domain.Utils; /** * @description desc * @author liyuping * @version 1.0 * @modify liyuping 2018年1月17日 create */ public abstract class AbstractBatchImport { protected abstract <T> T grapData(); protected abstract <T> String parseData(T t); public void execute(){ String parsedData = parseData(grapData()); Utils.batchImport(parsedData); } }
工具類(內有批量匯入的方法):import java.util.logging.Logger; /** * @description desc * @author liyuping * @version 1.0 * @modify liyuping 2018年1月17日 create */ public class BatchImportFromSourceA extends AbstractBatchImport{ private Logger logger = Logger.getLogger("BatchImportFromSourceA"); @Override protected <T> T grapData() { logger.info("抓取資料"); return null; } @Override protected <T> String parseData(T t) { logger.info("解析資料"); return null; } }
呼叫類:import java.util.logging.Logger; /** * @description desc * @author liyuping * @version 1.0 * @modify liyuping 2018年1月17日 create */ public class Utils { private static Logger logger = Logger.getLogger("Utils"); public static void batchImport(String data){ logger.info("批量匯入資料:"+data); } }
/**
* @description desc
* @author liyuping
* @version 1.0
* @modify liyuping 2018年1月17日 create
*/
public class Main {
public static void main(String[] args) {
AbstractBatchImport batchImport = new BatchImportFromSourceA();
batchImport.execute();
}
}
執行呼叫類的main方法,可以得到如下結果:
現想優化日誌,在執行整個操作之前列印“begin”,在執行整個操作之後列印“end”。於是在抽象父類裡增加屬性logger。但是有一個問題,怎麼賦值?
經研究後,可通過在子類中給super.logger賦值。
import java.util.logging.Logger;
/**
* @description desc
* @author liyuping
* @version 1.0
* @modify liyuping 2018年1月17日 create
*/
public abstract class AbstractBatchImport {
protected Logger logger;
protected abstract void setLogger();
protected abstract <T> T grapData();
protected abstract <T> String parseData(T t);
public void execute(){
setLogger();
logger.info("begin");
String parsedData = parseData(grapData());
Utils.batchImport(parsedData);
logger.info("end");
}
}
import java.util.logging.Logger;
/**
* @description desc
* @author liyuping
* @version 1.0
* @modify liyuping 2018年1月17日 create
*/
public class BatchImportFromSourceA extends AbstractBatchImport{
private Logger logger = Logger.getLogger("BatchImportFromSourceA");
@Override
protected void setLogger() {
super.logger = this.logger;
}
@Override
protected <T> T grapData() {
logger.info("抓取資料");
return null;
}
@Override
protected <T> String parseData(T t) {
logger.info("解析資料");
return null;
}
}
再次執行呼叫類的main方法,可以得到如下結果: