《設計模式》 模板模式

2021-06-28 15:27:05 字數 1995 閱讀 7212

模板模式在諸多模式中算是比較簡單的乙個,即便乙個新手,也能很快的上手和使用。雖然簡單,但合理的在專案中使用帶來的好處可不小。軟體設計中有個很重要的原則:dry(don't repeat yourself),重複有很多種,比如**重複,邏輯重複,而模板模式的最拿手的就是消除邏輯重複。

我們先看一下模板模式的定義:在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中去實現。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。只要你學習過任何一門物件導向語言,那麼理解上面的定義肯定不是問題。

來看看模式的uml類圖:

abstractclass是乙個抽象類,其中templatemethod是乙個final方法,封裝了具體的演算法實現步驟、過程,其內部呼叫了其它方法。abstractmethod1與abstractmethod2是抽象方法,其具體實現由具體的子類決定,這樣子類就可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。值得一提的是hook方法,它是乙個鉤子方法,在父類中會提供乙個預設的實現,子類可以有選擇的決定是否要覆蓋鉤子方法。簡單而言,鉤子讓子類有機會修改演算法中的某些步驟,是否使用鉤子完全取決於業務。

我們來看乙個例子。

飲料製作 飲料

牛奶咖啡

1. 把杯子洗乾淨。

2. 把水煮沸。

3. 把飲料放入杯子。

4. 把開水倒入杯中。

5. 加調料。

6. 攪拌。

1. 把杯子洗乾淨。

2. 把水煮沸。

3. 把奶粉放入杯子。

4. 把開水倒入杯中。

5. 加糖。

6. 攪拌。

1. 把杯子洗乾淨。

2. 把水煮沸。

3. 把咖啡放入杯子。

4. 把開水倒入杯中。

5. 加糖、伴侶。

6. 攪拌。

飲料(beverage是乙個抽象類,make方法封裝了飲料的製作流程,但具體製作什麼飲料,加不加調料、加什麼調料由給子類去決定,addcondiment方法是乙個鉤子,預設什麼都不做。

public abstract class beverage 

protected abstract void addbeverage();

protected void addcondiment()

}

牛奶(milk是乙個實現類,僅實現addbeverage方法;coffee也是乙個實現類,實現了addbeverage,並且覆蓋了addcondiment方法(不加糖咖啡太苦啦)。

public class milk extends beverage 

}public class coffee extends beverage

@override

protected void addcondiment()

}

執行結果:

public static void main(string args) 

做牛奶......

把杯子洗乾淨。

把水煮沸。

把奶粉倒入杯口。

把水倒入杯中。

攪拌。做咖啡......

把杯子洗乾淨。

把水煮沸。

把咖啡倒入杯口。

把水倒入杯中。

加糖和咖啡伴侶。

攪拌。

jdk中有哪些使用模板模式的部分?像collections.sort、arrays.sort等方法,都需要乙個實現comparator介面的物件來決定如何比較物件(實現compare方法);

又如file.listfiles方法需要乙個實現filefilter介面的物件來決定如何過濾檔案(通過實現accept方法),在jdk中類似的場景還有很多,這裡就不一一例舉了。

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

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

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

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

設計模式 模板設計模式

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