Java中的模板方法模式是一種行為設計模式,用於定義演算法的框架並允許子類別重寫某些步驟,同時不改變演算法的結構.
此模式基於開放/關閉原則,即對擴展開放,對修改關閉,在模板方法模式中,父類定義了一個算法的骨架,而子類可以通過實現父類的抽象方法,來自定義某些步驟的行為,整個演算法步驟不會因為子類別的改變而改變
模板方法模式通常包括一個抽象類別和若干個具體子類別,抽象類別中定義了演算法的框架,包括一些基本的方法和一個模板方法.模板方法是一個模板,其中包含了算法的步驟,每個步驟都有一個抽象方法或一個默認方法實現,具體的子類可以通過實現這些抽象方法來實現自己的行為.
抽象類別中還可以有鉤子函數,鉤子函數通常是抽象類別中的虛擬函數,其預設實現為空,這樣子類別可以選擇覆蓋該函數來實現特定的行為.在模板方法模式中,鉤子函數通常用於在演算法的某些特定步驟中進行特定的操作或檢查條件.鉤子函數的另一個用途是提供一種擴展演算法的方法,子類可以透過覆蓋鉤子函數來添加額外的步驟或者修改演算法的行為.總之鉤子函數是模板方法模式中的一個重要概念,可以用來影響演算法的行為或擴展演算法的功能.
首先定義咖啡抽象類別
package com.fanqiechaodan.templatemethod; /** * @Classname CoffeeMaker * @Description 咖啡抽象类 */ public abstract class CoffeeMaker { public final void makeCoffee() { boilWater(); brewCoffee(); pourInCup(); if (isCondiments()) { addCondiments(); } } private void boilWater() { System.out.println("煮水"); } protected abstract void brewCoffee(); private void pourInCup() { System.out.println("倒入杯子中"); } /** * 钩子函数;是否加入调料,由子类决定是否重写 * * @return */ protected boolean isCondiments() { return true; } protected abstract void addCondiments(); }
其次定義兩個具體子類別
public class AmericanoMaker extends CoffeeMaker{ @Override protected void brewCoffee() { System.out.println("冲泡美式咖啡"); } @Override protected void addCondiments() { System.out.println("加入牛奶和糖"); } /** * 钩子函数;是否加入调料,由子类决定是否重写 * * @return */ @Override protected boolean isCondiments() { return false; } } public class LatteMaker extends CoffeeMaker{ @Override protected void brewCoffee() { System.out.println("冲泡浓缩咖啡"); } @Override protected void addCondiments() { System.out.println("添加奶泡和焦糖酱"); } }
測試
package com.fanqiechaodan.templatemethod; /** * @author fanqiechaodan * @Classname Demo * @Description 模板方法模式 * @Date 2023/3/9 18:57 */ public class Demo { public static void main(String[] args) { CoffeeMaker americanoMaker = new AmericanoMaker(); americanoMaker.makeCoffee(); System.out.println(); CoffeeMaker latteMaker = new LatteMaker(); latteMaker.makeCoffee(); } }
以上是Java模板方法模式的演算法框架定義及使用方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!