国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢(xún) 在線咨詢(xún)
15158846557 在線咨詢(xún)
所在位置: 首頁(yè) > 營(yíng)銷(xiāo)資訊 > 網(wǎng)站運(yùn)營(yíng) > 模板模式(Java版)

模板模式(Java版)

時(shí)間:2023-06-12 10:57:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)

時(shí)間:2023-06-12 10:57:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)

模板模式(Java版):

什么是模板模式?

一個(gè)抽象類(lèi)公開(kāi)定義了執(zhí)行它的方法的模板。它的子類(lèi)可以按需要重寫(xiě)方法實(shí)現(xiàn),但調(diào)用將以抽象類(lèi)中定義的方式進(jìn)行。模板方法使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu),即可重定義該算法的某些特定步驟(通用代碼在抽象類(lèi)實(shí)現(xiàn),其他步驟在子類(lèi)實(shí)現(xiàn))。接下來(lái),將以我工作中用到的場(chǎng)景舉例。

背景

我們有一個(gè)模型訓(xùn)練平臺(tái),當(dāng)我們訓(xùn)練模型的時(shí)候,需要預(yù)處理,先檢測(cè)語(yǔ)料是否滿(mǎn)足需要,如果滿(mǎn)足發(fā)送模型訓(xùn)練消息到訓(xùn)練平臺(tái),生成訓(xùn)練任務(wù)ID返回。如果不滿(mǎn)足要求,我們直接返回訓(xùn)練失敗。

代碼示例




1.定義任務(wù)執(zhí)行接口

public interface BaseTrainService<K, V> { V execute(K vo);}


2.訓(xùn)練任務(wù)模板抽象類(lèi)-實(shí)現(xiàn)通用模板

@Slf4jpublic 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ù)

簡(jiǎn)單訓(xùn)練任務(wù)-不需要預(yù)處理,直接發(fā)送訓(xùn)練消息

@Slf4jpublic class SimpleTrainService extends CommonTrainService<TrainVO, Response<TrainDTO>> { @Override protected boolean preHandle(TrainVO vo) { return true; } @Override protected Response<TrainDTO> handle(TrainVO vo) { TrainDTO result = new TrainDTO(); ... return Response.success(result); } @Override protected Response<TrainDTO> postHandle(TrainVO vo, Response<TrainDTO> dto) { if (dto == null) { return Response.fail("創(chuàng)建訓(xùn)練任務(wù)失敗"); } return dto; } }


復(fù)雜訓(xùn)練任務(wù)-預(yù)處理判斷是否發(fā)送訓(xùn)練消息

@Slf4jpublic class ComplexTrainService extends CommonTrainService<TrainVO, Response<TrainDTO>> { @Override protected boolean preHandle(TrainVO vo) { List<TrainRecord> list = .... return CollectionUtils.isEmpty(list); } @Override protected Response<TrainDTO> handle(TrainVO vo) { TrainDTO result = new TrainDTO(); ... return Response.success(result); } @Override protected Response<TrainDTO> postHandle(TrainVO vo, Response<TrainDTO> dto) { if (dto == null) { return Response.fail("創(chuàng)建訓(xùn)練任務(wù)失敗"); } return dto; } }


4. 客戶(hù)端-調(diào)用具體類(lèi)型訓(xùn)練任務(wù)

public class Client { public Response<TrainDTO> simpleTrainTask(TrainVO vo){ ComplexTrainService service = new ComplexTrainService(); return service.execute(vo); }}


總結(jié)

優(yōu)點(diǎn):

1、封裝不變部分,擴(kuò)展可變部分。

2、提取公共代碼,便于維護(hù)。

3、行為由父類(lèi)控制,子類(lèi)實(shí)現(xiàn)。

缺點(diǎn):

每一個(gè)不同的實(shí)現(xiàn)都需要一個(gè)子類(lèi)來(lái)實(shí)現(xiàn),導(dǎo)致類(lèi)的個(gè)數(shù)增加,使得系統(tǒng)更加龐大。

使用場(chǎng)景:

1、有多個(gè)子類(lèi)共有的方法,且邏輯相同。

2、重要的、復(fù)雜的方法,可以考慮作為模板方法。

注意事項(xiàng):

為防止惡意操作,一般模板方法都加上 final 關(guān)鍵詞。

關(guān)鍵詞:模式,模板

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉