Java模板方法模式定義算法框架
介紹
? Java中的模板方法模式是一種行為設(shè)計(jì)模式,用于定義算法的框架并允許子類重寫(xiě)某些步驟,同時(shí)不改變算法的結(jié)構(gòu).
? 該模式基于開(kāi)放/關(guān)閉原則,即對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉,在模板方法模式中,父類定義了一個(gè)算法的骨架,而子類可以通過(guò)實(shí)現(xiàn)父類的抽象方法,來(lái)自定義某些步驟的行為,整個(gè)算法步驟不會(huì)因?yàn)樽宇惖母淖兌淖?/p>
? 模板方法模式通常包括一個(gè)抽象類和若干個(gè)具體子類,抽象類中定義了算法的框架,包括一些基本的方法和一個(gè)模板方法.模板方法是一個(gè)模板,其中包含了算法的步驟,每個(gè)步驟都有一個(gè)抽象方法或一個(gè)默認(rèn)方法實(shí)現(xiàn),具體的子類可以通過(guò)實(shí)現(xiàn)這些抽象方法來(lái)實(shí)現(xiàn)自己的行為.
? 抽象類中還可以有鉤子函數(shù),鉤子函數(shù)通常是抽象類中的虛函數(shù),其默認(rèn)實(shí)現(xiàn)為空,這樣子類可以選擇覆蓋該函數(shù)來(lái)實(shí)現(xiàn)特定的行為.在模板方法模式中,鉤子函數(shù)通常用于在算法的某些特定步驟中進(jìn)行特定的操作或檢查條件.鉤子函數(shù)的另一個(gè)用途是提供一種擴(kuò)展算法的方法,子類可以通過(guò)覆蓋鉤子函數(shù)來(lái)添加額外的步驟或者修改算法的行為.總之鉤子函數(shù)是模板方法模式中的一個(gè)重要概念,可以用來(lái)影響算法的行為或者擴(kuò)展算法的功能.
實(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)料,由子類決定是否重寫(xiě) * * @return */ protected boolean isCondiments() { return true; } protected abstract void addCondiments(); }
其次定義兩個(gè)具體子類
public class AmericanoMaker extends CoffeeMaker{ @Override protected void brewCoffee() { System.out.println("沖泡美式咖啡"); } @Override protected void addCondiments() { System.out.println("加入牛奶和糖"); } /** * 鉤子函數(shù);是否加入調(diào)料,由子類決定是否重寫(xiě) * * @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("添加奶泡和焦糖醬"); } }
測(cè)試
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)點(diǎn)
- 提高代碼復(fù)用性:模板方法模式將通用算法代碼封裝在父類中,子類只需要特定的方法即可,從而提高了代碼的復(fù)用性.
- 保證算法結(jié)構(gòu)的一致性:模板方法模式規(guī)定了算法的基本流程和結(jié)構(gòu),確保所有子類實(shí)現(xiàn)的算法結(jié)構(gòu)一致,從而提高了代碼的可維護(hù)性和可擴(kuò)展性.
- 降低代碼耦合度:通過(guò)將具體實(shí)現(xiàn)細(xì)節(jié)封裝在子類中,父類與子類之間的耦合度降低,提高了代碼的靈活性和可擴(kuò)展性.
缺點(diǎn)
- 可能會(huì)導(dǎo)致類的數(shù)量增加:使用模板方法模式需要定義抽象類和具體實(shí)現(xiàn)類,這可能會(huì)導(dǎo)致類的數(shù)量增加,從而增加代碼的復(fù)雜度.
- 限制子類的靈活性:模板方法規(guī)定了算法的基本流程和結(jié)構(gòu),子類需要按照這個(gè)結(jié)構(gòu)去實(shí)現(xiàn),這可能會(huì)限制子類的靈活性.
應(yīng)用場(chǎng)景
- 當(dāng)我們需要定義一個(gè)算法骨架結(jié)構(gòu),從而具體實(shí)現(xiàn)細(xì)節(jié)可以在子類中進(jìn)行定義時(shí),可以使用模板方法模式.
- 當(dāng)我們需要一些復(fù)雜的算法分解為一系列簡(jiǎn)單的步驟,并且這些步驟的順序和流程都是固定的時(shí),可以使用模板方法模式
- 當(dāng)我們需要在多個(gè)子類中共享一些公共的代碼時(shí),可以使用模板方法模式,將這些公共的代碼封裝在父類中.
到此這篇關(guān)于Java模板方法模式定義算法框架的文章就介紹到這了,更多相關(guān)Java模板方法模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)簡(jiǎn)易點(diǎn)菜器
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)易點(diǎn)菜器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12SpringBoot根據(jù)目錄結(jié)構(gòu)自動(dòng)生成路由前綴的實(shí)現(xiàn)代碼
本文介紹如何根據(jù)目錄結(jié)構(gòu)給RequestMapping添加路由前綴,具體實(shí)現(xiàn)方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-08-08Java分布式鎖理論(redis、zookeeper))案例詳解
zookeeper有個(gè)節(jié)點(diǎn)路徑的概念,節(jié)點(diǎn)路徑不能重復(fù),保證了唯一性,這篇文章給大家介紹Java分布式鎖理論(redis、zookeeper)?案例詳解,感興趣的朋友跟隨小編一起看看吧2024-01-01SpringBoot常見(jiàn)錯(cuò)誤圖文總結(jié)
最近在使用idea+Springboot開(kāi)發(fā)項(xiàng)目中遇到一些問(wèn)題,這篇文章主要給大家介紹了關(guān)于SpringBoot常見(jiàn)錯(cuò)誤總結(jié)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06解決Java中SimpleDateFormat線程不安全的五種方案
SimpleDateFormat 就是一個(gè)典型的線程不安全事例,本文主要介紹了解決Java中SimpleDateFormat線程不安全的五種方案,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Spring Data JPA調(diào)用存儲(chǔ)過(guò)程實(shí)例代碼
本篇文章主要介紹了Spring Data JPA調(diào)用存儲(chǔ)過(guò)程實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04Java中優(yōu)先隊(duì)列PriorityQueue常用方法示例
這篇文章主要介紹了Java中優(yōu)先隊(duì)列PriorityQueue常用方法示例,PriorityQueue是一種特殊的隊(duì)列,滿足隊(duì)列的“隊(duì)尾進(jìn)、隊(duì)頭出”條件,但是每次插入或刪除元素后,都對(duì)隊(duì)列進(jìn)行調(diào)整,使得隊(duì)列始終構(gòu)成最小堆(或最大堆),需要的朋友可以參考下2023-09-09