目錄
- 理論
- 實踐
- 總結
理論
1.模板模式:定義一個操作演算法中的框架,而將這些步驟延遲加載到子類中,
模板方法模式使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟;
2.角色:
抽象模板(Abstract Template)角色:
- 定義了一個或多個抽象操作,以便讓子類實作,這些抽象操作叫做基本操作,它們是一個頂級邏輯的組成步驟,
- 定義并實作了一個模板方法,這個模板方法一般是一個具體方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實作,頂級邏輯也有可能呼叫一些具體方法,
具體模板(Concrete Template)角色:
- 實作父類所定義的一個或多個抽象方法,它們是一個頂級邏輯的組成步驟,
- 每一個抽象模板角色都可以有任意多個具體模板角色與之對應,而每一個具體模板角色都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實作,從而使得頂級邏輯的實作各不相同,
3.適合場景:
- 一次性實作一個演算法的不變部分,并將可變的行為留給子類來實作,
- 各子類中公共的行為應被提取出來并集中到一個公共父類中以避免代碼重復,
- 需要通過子類來決定父類演算法中某個步驟是否執行,實作子類對父類的反向控制,
實踐
- 抽象模板類
package com.qxy.design.template;
/**
* @author qxy
* @date 2020/10/16 2:30 下午
*/
public abstract class FileAnalysisTemplate {
//定義模版方法,對外部訪問
public final void analysisFile() {
//1.驗證檔案后綴
validateFileSuffix();
//2.決議檔案內容
analysisFileLine();
//3.驗證檔案標題列
validateFileTitle();
//處理鉤子方法
if (specialFileColumn()) {
handlerSpecialColumn();
}
//4.封裝pojo
createPojo();
//5.互動資料庫
operateDataSource();
}
protected void validateFileSuffix() {
System.out.println("驗證檔案后綴成功:檔案后綴為.xls或者.xlsx");
}
protected void analysisFileLine() {
System.out.println("檔案決議成功:共用一套決議檔案方法或者工具類");
}
protected abstract void validateFileTitle();
protected abstract void createPojo();
protected void operateDataSource() {
System.out.println("資料入庫成功");
}
/**
* 是否特殊處理列資料
* @return false
*/
protected boolean specialFileColumn() {
return false;
}
/**
* 鉤子方法:交給子類具體實作處理
*/
protected void handlerSpecialColumn() {
}
}
- 具體模板角色:ItemAFileAnalysis
package com.qxy.design.template;
/**
* @author qxy
* @date 2020/10/16 3:08 下午
*/
public class ItemAFileAnalysis extends FileAnalysisTemplate{
@Override
protected void validateFileTitle() {
System.out.println("驗證專案A的標題列是否缺失");
}
@Override
protected void createPojo() {
System.out.println("創建專案A物件");
}
@Override
protected boolean specialFileColumn() {
return true;
}
@Override
protected void handlerSpecialColumn() {
System.out.println("特殊處理:處理專案名字");
}
}
- 具體模板角色:ItemBFileAnalysis
package com.qxy.design.template;
/**
* @author qxy
* @date 2020/10/16 3:10 下午
*/
public class ItemBFileAnalysis extends FileAnalysisTemplate{
@Override
protected void validateFileTitle() {
System.out.println("驗證專案B的標題列是否缺失");
}
@Override
protected void createPojo() {
System.out.println("創建項B物件");
}
}
- 客戶端
package com.qxy.design.template;
/**
* @author qxy
* @date 2020/10/16 3:07 下午
*/
public class FileClient {
public static void main(String[] args) {
FileAnalysisTemplate aFileAnalysis = new ItemAFileAnalysis();
aFileAnalysis.analysisFile();
System.out.println("-----------");
FileAnalysisTemplate bFileAnalysis = new ItemBFileAnalysis();
bFileAnalysis.analysisFile();
}
}
執行結果如下:
驗證檔案后綴成功:檔案后綴為.xls或者.xlsx
檔案決議成功:共用一套決議檔案方法或者工具類
驗證專案A的標題列是否缺失
特殊處理:處理專案名字
創建專案A物件
資料入庫成功
-----------
驗證檔案后綴成功:檔案后綴為.xls或者.xlsx
檔案決議成功:共用一套決議檔案方法或者工具類
驗證專案B的標題列是否缺失
創建項B物件
資料入庫成功
Process finished with exit code 0
總結
優點:
- 封裝不變的部分,將不變的部分抽取出來;
- 擴展可變部分,將可變的設定抽象方法,讓具體子類來實作,
- 抽取的公共代碼,便于后期維護,
- 行為有基類來控制,具體操作有子類實作,
缺點:
每一個不同的實作都需要有一個子類來實作,這樣就會導致類的數量大大的增加,使得系統更加龐大,
特別注意:
為了防止演算法骨架被惡意的破壞或者惡意的操作,一般在使用模板模式的時候,模板方法都會加上final這個關鍵字來限制,
模板模式的關鍵是:子類可以置換掉父類的可變部分,但是子類卻不可以改變模板方法所代表的頂級邏輯,
每當定義一個新的子類時,不要按照控制流程的思路去想,而應當按照“責任”的思路去想,換言之,應當考慮哪些操作是必須置換掉的,哪些操作是可以置換掉的,以及哪些操作是不可以置換掉的,使用模板模式可以使這些責任變得清晰,
源代碼傳送門:https://github.com/stream-source/stream-source
參考資料:Java設計模式
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/195758.html
標籤:python
