Java模板方法模式定義算法框架
介紹
? Java中的模板方法模式是一種行為設(shè)計模式,用于定義算法的框架并允許子類重寫某些步驟,同時不改變算法的結(jié)構(gòu).
? 該模式基于開放/關(guān)閉原則,即對擴展開放,對修改關(guān)閉,在模板方法模式中,父類定義了一個算法的骨架,而子類可以通過實現(xiàn)父類的抽象方法,來自定義某些步驟的行為,整個算法步驟不會因為子類的改變而改變
? 模板方法模式通常包括一個抽象類和若干個具體子類,抽象類中定義了算法的框架,包括一些基本的方法和一個模板方法.模板方法是一個模板,其中包含了算法的步驟,每個步驟都有一個抽象方法或一個默認方法實現(xiàn),具體的子類可以通過實現(xiàn)這些抽象方法來實現(xiàn)自己的行為.
? 抽象類中還可以有鉤子函數(shù),鉤子函數(shù)通常是抽象類中的虛函數(shù),其默認實現(xiàn)為空,這樣子類可以選擇覆蓋該函數(shù)來實現(xiàn)特定的行為.在模板方法模式中,鉤子函數(shù)通常用于在算法的某些特定步驟中進行特定的操作或檢查條件.鉤子函數(shù)的另一個用途是提供一種擴展算法的方法,子類可以通過覆蓋鉤子函數(shù)來添加額外的步驟或者修改算法的行為.總之鉤子函數(shù)是模板方法模式中的一個重要概念,可以用來影響算法的行為或者擴展算法的功能.
實現(xiàn)
首先定義咖啡抽象類
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("倒入杯子中");
}
/**
* 鉤子函數(shù);是否加入調(diào)料,由子類決定是否重寫
*
* @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("加入牛奶和糖");
}
/**
* 鉤子函數(shù);是否加入調(diào)料,由子類決定是否重寫
*
* @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();
}
}
總結(jié)
優(yōu)點
- 提高代碼復(fù)用性:模板方法模式將通用算法代碼封裝在父類中,子類只需要特定的方法即可,從而提高了代碼的復(fù)用性.
- 保證算法結(jié)構(gòu)的一致性:模板方法模式規(guī)定了算法的基本流程和結(jié)構(gòu),確保所有子類實現(xiàn)的算法結(jié)構(gòu)一致,從而提高了代碼的可維護性和可擴展性.
- 降低代碼耦合度:通過將具體實現(xiàn)細節(jié)封裝在子類中,父類與子類之間的耦合度降低,提高了代碼的靈活性和可擴展性.
缺點
- 可能會導(dǎo)致類的數(shù)量增加:使用模板方法模式需要定義抽象類和具體實現(xiàn)類,這可能會導(dǎo)致類的數(shù)量增加,從而增加代碼的復(fù)雜度.
- 限制子類的靈活性:模板方法規(guī)定了算法的基本流程和結(jié)構(gòu),子類需要按照這個結(jié)構(gòu)去實現(xiàn),這可能會限制子類的靈活性.
應(yīng)用場景
- 當我們需要定義一個算法骨架結(jié)構(gòu),從而具體實現(xiàn)細節(jié)可以在子類中進行定義時,可以使用模板方法模式.
- 當我們需要一些復(fù)雜的算法分解為一系列簡單的步驟,并且這些步驟的順序和流程都是固定的時,可以使用模板方法模式
- 當我們需要在多個子類中共享一些公共的代碼時,可以使用模板方法模式,將這些公共的代碼封裝在父類中.
到此這篇關(guān)于Java模板方法模式定義算法框架的文章就介紹到這了,更多相關(guān)Java模板方法模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
rabbitmq消息ACK確認機制及發(fā)送失敗處理方式
這篇文章主要介紹了rabbitmq消息ACK確認機制及發(fā)送失敗處理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
解決mybatis 數(shù)據(jù)庫date 與 java中Date類型映射問題
這篇文章主要介紹了解決mybatis 數(shù)據(jù)庫date 與 java中Date類型映射問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來吧2020-11-11
Java使用JXLS實現(xiàn)導(dǎo)出Excel
jxls作為一個開源工具,提供了一種高效且易于維護的方式來處理復(fù)雜的Excel導(dǎo)出需求,下面就跟隨小編一起來學習一下如何使用jxls實現(xiàn)導(dǎo)出Excel吧2025-01-01
Spring?Boot?+?EasyExcel實現(xiàn)數(shù)據(jù)導(dǎo)入導(dǎo)出
這篇文章主要介紹了Spring?Boot+EasyExcel實現(xiàn)數(shù)據(jù)導(dǎo)入導(dǎo)出,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-08-08

