Java設(shè)計模式之Template?Pattern模板模式詳解
一、定義
模板模式(Template Pattern):行為型模式之一,抽象父類定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。
二、UML類圖
三、角色職責
抽象類/抽象模板(Abstract Class):抽象模板類,負責給出一個算法的輪廓和骨架。 它
由一個模板方法和若干個基本方法構(gòu)成。這些方法的定義如下:
- 模板方法:定義了一套算法的骨架,按某種順序調(diào)用其包含的基本方法。
- 基本方法:是算法骨架/流程的某些步驟進行具體實現(xiàn),包含以下幾種類型,
- 抽象方法:在抽象類中聲明,由具體子類實現(xiàn)。 具體方法:在抽象類中已經(jīng)實現(xiàn),在具體子類中可以繼承或重寫它。
- 鉤子方法:在抽象類中已經(jīng)實現(xiàn),包括用于判斷的邏輯方法和需要子類重寫的空方法兩種。
具體子類/具體實現(xiàn)(Concrete Class):具體實現(xiàn)類,實現(xiàn)抽象類中所定義的抽象方法和鉤子方法,它們是一個頂級邏輯的一個組成步驟。
四、代碼實現(xiàn)
前言:在平時工作中就經(jīng)常會用到模板方法,就像我們公司的框架里使用的Excel導(dǎo)入功能EasyExcel,就是一個非常典型的模板方法,我們通常會頂一個抽象類并在里面規(guī)定出一些模板方法和基本方法,再由具體的實現(xiàn)類去進行調(diào)用或者重寫,下面就用代碼給大家舉個栗子。
導(dǎo)入抽象類(抽象類 Abstract Class)
abstract class ImportAbstractClass { public void TemplateMethod() { validateColumn(); validateField(); bizHandle(); } public void validateColumn() { System.out.println("校驗導(dǎo)入Excel的列名..."); } public abstract void validateField(); public abstract void bizHandle(); }
導(dǎo)入訂單實現(xiàn)類(具體子類 Concrete Class)
public class ImportOrderClass extends ImportAbstractClass { @Override public void validateField() { System.out.println("校驗導(dǎo)入訂單字段..."); } @Override public void bizHandle() { System.out.println("訂單業(yè)務(wù)處理..."); } }
導(dǎo)入商品實現(xiàn)類(具體子類 Concrete Class)
public class ImportProductClass extends ImportAbstractClass { @Override public void validateField() { System.out.println("校驗導(dǎo)入商品字段..."); } @Override public void bizHandle() { System.out.println("商品業(yè)務(wù)處理..."); } }
測試類
public class TemplateTest { public static void main(String[] args) { ImportAbstractClass order = new ImportOrderClass(); order.TemplateMethod(); ImportAbstractClass product = new ImportProductClass(); product.TemplateMethod(); } }
輸出結(jié)果
校驗導(dǎo)入Excel的列名...
校驗導(dǎo)入訂單字段...
訂單業(yè)務(wù)處理...
校驗導(dǎo)入Excel的列名...
校驗導(dǎo)入商品字段...
商品業(yè)務(wù)處理...
五、源碼分析
模板模式的應(yīng)用場景非常多,就比如我們常用的MyBatis中的BaseExecutor類就使用到了模板模式。
在主流程中,我們可以直接調(diào)用query方法,也可以通過實現(xiàn)抽象方法doQuery進行使用。
六、優(yōu)缺點分析
優(yōu)點:
- 不變部分封裝到父類實現(xiàn),而把可變部分由子類繼承實現(xiàn),便于子類繼續(xù)擴展。
- 在父類中提取了公共的部分代碼,便于代碼復(fù)用。
- 部分方法是由子類實現(xiàn)的,因此子類可以通過擴展方式增加相應(yīng)的功能,符合開閉原則。
缺點:
- 對每個不同的實現(xiàn)都需要定義一個子類,導(dǎo)致類的個數(shù)增加,系統(tǒng)更龐大,設(shè)計更抽象。
- 父類中的抽象方法由子類實現(xiàn),子類執(zhí)行的結(jié)果會影響父類的結(jié)果,它提高了代碼閱讀的難度。
七、適用場景
- 多個子類有共有的方法,并且邏輯基本相同。
- 重要、復(fù)雜的算法,可以把核心算法設(shè)計為模板方法,周邊的相關(guān)細節(jié)功能則由各個子類實現(xiàn)。
八、總結(jié)
當我們要完成在某一細節(jié)層次一致的一個過程或一系列步驟,但其個別步驟在更詳細的層次上的實現(xiàn)可能不同時,我們通??紤]模板方法模式來處理。模板模式只是在一定程度上完成了解耦的操作,當不變的和可變的行為在方法的子類實現(xiàn)中混合在一起的時候,不變的行為就會在子類中重復(fù)出現(xiàn)。我們通過模板方法模式把這些行文搬移到單一的地方(提取公有部分,抽象成抽象方法),這樣就幫助子類擺脫重復(fù)的不變行為的糾纏。
到此這篇關(guān)于Java設(shè)計模式之Template Pattern模板模式詳解的文章就介紹到這了,更多相關(guān)Template Pattern模板模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Security Oauth2.0 實現(xiàn)短信驗證碼登錄示例
本篇文章主要介紹了Spring Security Oauth2.0 實現(xiàn)短信驗證碼登錄示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01Springboot實例講解實現(xiàn)專業(yè)材料認證管理系統(tǒng)流程
這是一個基于java的畢業(yè)設(shè)計項目,畢設(shè)課題為springboot框架的知識產(chǎn)權(quán)服務(wù)平臺系統(tǒng),是一個采用b/s結(jié)構(gòu)的javaweb項目,需要的朋友可以參考下2022-06-06Java靜態(tài)static與實例instance方法示例
這篇文章主要為大家介紹了Java靜態(tài)static與實例instance方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08java 中HashMap、HashSet、TreeMap、TreeSet判斷元素相同的幾種方法比較
這篇文章主要介紹了從源碼的角度淺析HashMap、TreeMap元素的存儲和獲取元素的邏輯;從Map與Set之間的關(guān)系淺析常用的Set中元素的存儲和判斷是否重復(fù)的邏輯,需要的朋友可以參考下2017-01-01