1. 程式人生 > >抽象父類的屬性設定

抽象父類的屬性設定

需求:異構資料入庫。資料來源可能有多個,每個資料來源的資料格式也都不一樣。

分析: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方法,可以得到如下結果: