什么是模板模式揭鳞?
一個抽象類公開定義了執(zhí)行它的方法的模板歇由。它的子類可以按需要重寫方法實現(xiàn),但調(diào)用將以抽象類中定義的方式進(jìn)行。模板方法使得子類可以不改變一個算法的結(jié)構(gòu)蕴侣,即可重定義該算法的某些特定步驟(通用代碼在抽象類實現(xiàn)其垄,其他步驟在子類實現(xiàn))扔役。接下來权纤,將以我工作中用到的場景舉例。
背景
我們有一個模型訓(xùn)練平臺逼龟,當(dāng)我們訓(xùn)練模型的時候评凝,需要預(yù)處理,先檢測語料是否滿足需要腺律,如果滿足發(fā)送模型訓(xùn)練消息到訓(xùn)練平臺奕短,生成訓(xùn)練任務(wù)ID返回。如果不滿足要求匀钧,我們直接返回訓(xùn)練失敗翎碑。
代碼示例
1.定義任務(wù)執(zhí)行接口
public interface BaseTrainService<K, V> {
V execute(K vo);
}
2.訓(xùn)練任務(wù)模板抽象類-實現(xiàn)通用模板
@Slf4j
public abstract class CommonTrainService<K, V> implements BaseTrainService<K, V> {
// 預(yù)處理
protected abstract boolean preHandle(K vo);
// 核心處理流程
protected abstract V handle(K vo);
// 后處理
protected abstract V postHandle(K vo, V dto);
@Override
public final V execute(K vo) {
? V dto = null;
? try {
? boolean flag = preHandle(vo);
? if (flag) {
? ? dto = handle(vo);
? }
? dto = postHandle(vo, dto);
? } catch (Exception e) {
? log.error("處理訓(xùn)練任務(wù)異常", e);
? }
? return dto;
}
}
3.訓(xùn)練任務(wù)
簡單訓(xùn)練任務(wù)-不需要預(yù)處理,直接發(fā)送訓(xùn)練消息
@Slf4j
public class SimpleTrainService extends CommonTrainService<TrainVO, Response<TrainDTO>> {
@Override
protected boo