設計模式 模板模式

2021-09-12 22:58:34 字數 2031 閱讀 1056

模板模式

通常又叫模板方法模式(template method pattern)是指定義乙個演算法的骨架,並允許子類為乙個或者多個步驟提供實現。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟,屬於行為性設計模式。模板方法適用於以下應用場景:

1、一次性實現乙個演算法的不變的部分,並將可變的行為留給子類來實現。

2、各子類中公共的行為被提取出來並集中到乙個公共的父類中,從而避免**重複。

舉個例子我們定義乙個任務類,類中記錄執行日誌等操作都完全一致,只有具體的執行邏輯不同。就可以把具體執行邏輯交給子類去實現,其他通用的部分在抽象類中實現。

basetask 類

public abstract class basetask 

public void run()

//真正的執行邏輯由子類實現

protected abstract void excutetask();

public string getname()

public void setname(string name)

}

資料處理任務類datahandletask ,只需要繼承basetask 並實現邏輯方法即可。

public class datahandletask extends basetask 

@override

protected void excutetask()

public static void main(string args)

}

執行**結果如下:

再有其他的任務的話 同樣的方法去實現。

模板模式在原始碼中的體現

jdk 中的abstractlist

public abstract class abstractlistextends abstractcollectionimplements list
我們看到get()是乙個抽象方法,那麼它的邏輯就是交給子類來實現,我們大家所熟知的arraylist 就是abstractlist 的子類。同理, 有abstractlist 就有abstractset 和abstractmap.還有乙個每天都在用的httpservlet,有三個方法service()和doget()、dopost()方法,我們在編寫servlet 的時候只需要實現具體的業務方法即可,不需要關注其他邏輯 ,都是模板方法的抽象實現。

mybatis 框架也有一些經典的應用,我們來一下baseexecutor 類,它是乙個基礎的sql 執行類,實現了大部分的sql 執行邏輯,然後把幾個方法交給子類定製化完成,原始碼如下:

public abstract class baseexecutor implements executor
如doupdate、doflushstatements、doquery、doquerycursor 這幾個方法就是交由子類來實現,那麼baseexecutor 有哪些子類呢?我們來看一下它的類圖:

模板模式的優缺點

優點:

1、利用模板方法將相同處理邏輯的**放到抽象父類中,可以提高**的復用性。

2、將不同的**不同的子類中,通過對子類的擴充套件增加新的行為,提高**的擴充套件性。

3、把不變的行為寫在父類上,去除子類的重複**,提供了乙個很好的**復用平台,符合開閉原則。

缺點:

1、類數目的增加,每乙個抽象類都需要乙個子類來實現,這樣導致類的個數增加。

2、類數量的增加,間接地增加了系統實現的複雜度。

3、繼承關係自身缺點,如果父類新增新的抽象方法,所有子類都要改一遍。

模板設計模式 設計模式 模板方法模式

在模板模式 template pattern 中,乙個抽象類公開定義了執行它的方法的方式 模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式。首先需要一定抽象的定義,沒有具體的實現,但是在抽象類的行為中,子類去程序這個抽象類,重寫抽象方法,實現不...

模板設計模式 設計模式之模板模式

模板模式,通常又叫做模板方法模式,乙個抽象類公開定義了執行方法的模板,它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方法進行,這種型別的設計模式屬於行為型模式。模板模式主要解決將通用的演算法抽象起來,同樣的 邏輯出現了重複,就可以使用模板模式進行重構。關鍵 在抽象類實現,其他步驟在子類實現...

設計模式 模板設計模式

1 抽象類 abstractclass類中實現了模板方法 template 定義了演算法的骨架,具體子類需要去實現,抽象方法operationr2,3,4 template operationr2,3,4可以是抽象方法,也可以是實現方法 如果是抽象方法,需要到子類實現即可 2 實現類 concret...