日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

模板方法模式介绍与示例

發布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模板方法模式介绍与示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

一、模板方法模式簡介

二、代碼示例

?三、總結


一、模板方法模式簡介

模板方法模式的核心設計思路是通過在抽象類中公開定義抽象方法的執行順序,并將抽象方法的設定為只有子類去實現但不設計獨立的訪問方法。即子類實現的抽象方法不能被其它類訪問,所有抽象方法的執行順序邏輯由抽象類中的公開方法進行控制。

解決的問題:系統中一些業務場景的方法能夠通用,每一個子類卻都需要重新實現這一方法。

何時使用:有一些通用實現方法的時候就可以使用。

使用場景: 1、有多個子類共有的方法,且邏輯相同。 2、重要或復雜的方法考慮作為模板方法。

二、代碼示例

首先我們先大概看下業務模型:假設我們現在有導入excel表格的功能,但是導入的excel表格伴隨著業務的區別各不相同,但是都屬于這個系統。

為了提高效率,沒有必要每個業務都去實現一套文件導入的邏輯,我們可以定義出一套Excel導入的業務邏輯模板,后續任何業務的Excel導入只需要繼承定義好的模板去實現各自的方法即可。

下面我們就根據上面描述的業務場景來模擬一下實現過程:

1.業務dto:用戶類和商品類;

@Data public class UserImportDto {/*** 用戶名稱*/private String name;/*** 家庭地址*/private String message;/*** 年齡*/private Integer age;} @Data public class ProductDto {/*** 商品名稱*/private String productName;/*** 商品編碼*/private String productCode;/*** 商品使用信息*/private String productInfo;/*** 商品價格*/private BigDecimal price; }

2.核心的抽象模板類:

/*** 不同業務的Excel表格導入公共實現模板;* 如果系統的所有excel導入都使用公共模板,除了業務不一樣,導入的過程是一樣的。*/ @Slf4j public abstract class ImportTemplate<T> {public Result importMethod(String fileName) {// 1.獲取模板文件列頭信息以及導入文件的列頭信息String fileHeadTemplate = fileHeadTemplate();String columnHeads = getColumnHeads(fileName);// 2.校驗導入數據的列頭是否和模板匹配;Boolean checkHeads = checkFileColumnHead(fileHeadTemplate,columnHeads);if (!checkHeads) {return Result.err("導入文件列頭與定義的表格列頭不一致!");}// 3.若列頭符合要求,獲取表中數據List<T> dataList = getFileData(fileName);if (CollectionUtils.isEmpty(dataList)) {log.info("未獲取到業務數據,導入失敗!");return Result.err("未獲取到導入的業務數據!");}// 4.導入的數據進行各自的業務校驗Boolean ok = checkDataList(dataList);if (!ok) {return Result.err("數據業務校驗失敗!");}// 5.業務校驗通過,保存數據saveData(dataList);return Result.ok("導入成功!");}/*** 需要導入的excel表格的列頭樣式;* @return*/protected abstract String fileHeadTemplate();/*** 獲取導入文件的列頭;** @return*/protected abstract String getColumnHeads(String fileName);/*** 校驗導入的列頭是否和模板樣例一致;** @return*/protected abstract Boolean checkFileColumnHead(String fileHeadTemplate,String columnHeads);/*** 獲取導入數據** @return*/protected abstract List<T> getFileData(String fileName);/*** 對導入的數據進行各種業務校驗** @param dataList* @return*/protected abstract Boolean checkDataList(List<T> dataList);/*** 校驗后的數據導入到服務器或者記錄到數據庫中;* @param list*/protected abstract void saveData(List<T> list);}

3.模板實現類:用戶Excel導入和商品Excel導入

@Slf4j public class UserInfoImport extends ImportTemplate<UserImportDto> {@Overrideprotected String fileHeadTemplate(){log.info("用戶excel表格模板==={}","用戶名稱,家庭地址,年齡");return "用戶名稱,家庭地址,年齡";}@Overrideprotected String getColumnHeads(String fileName) {// 此處省略實際獲取用戶導入文件列頭信息的業務邏輯,非設計模式關注的重點;log.info("獲取用戶導入文件的表頭==={}","用戶名稱,家庭地址,年齡");return "用戶名稱,家庭地址,年齡";}@Overrideprotected Boolean checkFileColumnHead(String fileHeadTemplate,String columnHeads) {// 如果導入文件的列頭和模板定義的列頭一致,校驗通過if(fileHeadTemplate.equals(columnHeads)){log.info("用戶excel表格導入文件表頭校驗通過");return true;}return false;}@Overrideprotected List<UserImportDto> getFileData(String fileName) {// 模擬從Linux文件服務器上獲取導入文件的數據List<UserImportDto> list = new ArrayList<>();log.info("獲取導入用戶數據");// 業務代碼省略。。。return list;}@Overrideprotected Boolean checkDataList(List<UserImportDto> dataList) {// 對獲取的數據進行業務校驗,比如姓名必須填寫;for(UserImportDto userImportDto : dataList){if(StringUtils.isEmpty(userImportDto.getName())){return false;}}log.info("導入的用戶數據校驗通過");return true;}@Overrideprotected void saveData(List<UserImportDto> list) {// 模擬實際的保存用戶數據業務邏輯// 數據入庫或存儲文件的代碼省略...log.info("用戶數據保存成功!");} } @Slf4j public class ProductImport extends ImportTemplate<ProductDto> {@Overrideprotected String fileHeadTemplate() {log.info("商品excel表格模板==={}","用戶名稱,家庭地址,年齡");return "商品名稱,商品編碼,商品使用信息,商品價格";}@Overrideprotected String getColumnHeads(String fileName) {// 此處省略實際獲取商品導入文件列頭信息的業務邏輯,非設計模式關注的重點;log.info("獲取商品導入文件的表頭==={}","商品名稱,商品編碼,商品使用信息,商品價格");return "商品名稱,商品編碼,商品使用信息,商品價格";}@Overrideprotected Boolean checkFileColumnHead(String fileHeadTemplate, String columnHeads) {// 如果導入文件的列頭和模板定義的列頭一致,校驗通過if (fileHeadTemplate.equals(columnHeads)) {log.info("商品excel表格導入文件表頭校驗通過");return true;}return false;}@Overrideprotected List<ProductDto> getFileData(String fileName) {// 模擬從專門的文件云服務器獲取導入文件的數據List<ProductDto> list = new ArrayList<>();ProductDto productDto = new ProductDto();productDto.setProductName("娃哈哈");productDto.setProductCode("123");productDto.setProductInfo("可以喝的AD鈣奶");productDto.setPrice(new BigDecimal("1"));list.add(productDto);log.info("獲取導入商品數據");// 業務代碼省略。。。return list;}@Overrideprotected Boolean checkDataList(List<ProductDto> dataList) {// 對獲取的數據進行業務校驗,比如姓名必須填寫;for (ProductDto userImportDto : dataList) {if (StringUtils.isEmpty(userImportDto.getProductCode())) {return false;}}log.info("導入的商品數據校驗通過");return true;}@Overrideprotected void saveData(List<ProductDto> list) {// 模擬實際的商品保存數據業務邏輯// 數據入庫或存儲文件的代碼省略...log.info("商品數據保存成功!");} }

4.測試類:

public class TemplateModelDemo {public static void main(String[] args) {System.out.println("模擬導入的用戶表格中無用戶信息");ImportTemplate userInfoImport = new UserInfoImport();userInfoImport.importMethod("xxxx");System.out.println("模擬導入有商品表格含有商品信息");ImportTemplate productImport = new ProductImport();productImport.importMethod("xxxx");}}

5.測試結果:

?三、總結

通過上面的實現可以看到模板方法模式在定義統一的結構也就是執行標準方面非常的方便,能很好的做到讓后續實現者不用關心調用邏輯,只需按照統一方式執行即可。

另外,模板方法模式也是為了解決子類通用方法,放到父類中進行優化設計。讓每一個子類只做子類需要完成的事情,而不需要關心其它邏輯。

簡單總結:行為由父類統一管理,可變擴展部分由子類各自實現。

總結

以上是生活随笔為你收集整理的模板方法模式介绍与示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。