最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你厲害Java設(shè)計模式中的模板方法

 更新時間:2023年01月30日 11:14:32   作者:Hollis  
模板方法定義了一個算法的步驟,并允許子類為一個或多個步驟提供實現(xiàn)。這篇文章就來帶大家了解一下Java模板方法的概念與實現(xiàn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

概念

在一個方法中定義了一個算法的骨架或者步驟,而將一些步驟延遲到子類中去實現(xiàn)。模板方法使得子類可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法中的某一些步驟。

該設(shè)計模式主要針對這樣一種場景:當(dāng)要做一件事兒的時候,這件事兒的步驟是固定好的,但是每一個步驟的具體實現(xiàn)方式是不一定的。這樣,我們可以把所有要做的事兒抽象到一個抽象類中,并在該類中定義一個模板方法。

舉例

去銀行的營業(yè)廳辦理業(yè)務(wù)需要以下步驟:1.取號、2.辦業(yè)務(wù)、3.評價。三個步驟中取號和評價都是固定的流程,每個人要做的事兒都是一樣的。但是辦業(yè)務(wù)這個步驟根據(jù)每個人要辦的事情不同所以需要有不同的實現(xiàn)。我們可以將整個辦業(yè)務(wù)這件事兒封裝成一個抽象類:

/**
 * 模板方法設(shè)計模式的抽象類
 * @author hollis
 */
public abstract class AbstractBusinessHandeler {
    /**
     * 模板方法
     */
    public final void execute(){
        getRowNumber();
        handle();
        judge();
    }
    /**
     * 取號
     * @return
     */
    private void getRowNumber(){
        System.out.println("rowNumber-00" + RandomUtils.nextInt());
    }
    /**
     * 辦理業(yè)務(wù)
     */
    public abstract void handle(); //抽象的辦理業(yè)務(wù)方法,由子類實現(xiàn)
    /**
     * 評價
     */
    private void judge(){
        System.out.println("give a praised");
    }
}

該類中定義了四個方法,其中getRowNumber、judge這兩個方法是私有的非抽象方法。他們實現(xiàn)了取號和評價的業(yè)務(wù)邏輯,因為這兩部分內(nèi)容是通用的。還有一個抽象的handle方法,這個方法需要子類去重寫,根據(jù)辦理業(yè)務(wù)的具體內(nèi)容重寫該方法。還有一個模板方法就是final類型的execute方法,他定義好了需要做的事兒和做這些事兒的順序。

現(xiàn)在,有了這個抽象類和方法,如果有人想要辦理業(yè)務(wù),那么只需要繼承該AbstractBusinessHandeler并且重寫handle方法,然后再使用該實現(xiàn)類的對象調(diào)用execute方法,即可完成整個辦理業(yè)務(wù)的流程。

public class SaveMoneyHandler extends AbstractBusinessHandeler {
    @Override
    public void handle() {
        System.out.println("save 1000");
    }
    public static void main(String []args){
        SaveMoneyHandler saveMoneyHandler = new SaveMoneyHandler();
        saveMoneyHandler.execute();
    }
}//output:編號:rowNumber-001   save 1000   give a praised

模板方法模式是結(jié)構(gòu)最簡單的行為型設(shè)計模式,在其結(jié)構(gòu)中只存在父類與子類之間的繼承關(guān)系。通過使用模板方法模式,可以將一些復(fù)雜流程的實現(xiàn)步驟封裝在一系列基本方法中,在抽象父類中提供一個稱之為模板方法的方法來定義這些基本方法的執(zhí)行次序,而通過其子類來覆蓋某些步驟,從而使得相同的算法框架可以有不同的執(zhí)行結(jié)果。模板方法模式提供了一個模板方法來定義算法框架,而某些具體步驟的實現(xiàn)可以在其子類中完成。

鉤子方法

當(dāng)在模板方法中某一些步驟是可選的時候,也就是該步驟不一定要執(zhí)行,可以由子類來決定是否要執(zhí)行,則此時就需要用上鉤子。鉤子是一種被聲明在抽象類中的方法,但一般來說它只是空的或者具有默認(rèn)值,子類可以實現(xiàn)覆蓋該鉤子,來設(shè)置算法步驟的某一步驟是否要執(zhí)行。鉤子可以讓子類實現(xiàn)算法中可選的部分,讓子類能夠有機(jī)會對模板方法中某些一即將發(fā)生的步驟做出反應(yīng)。

還是辦理業(yè)務(wù)的例子,如果來的客戶是vip客戶,那么他就可以不必取號,可以直接辦理業(yè)務(wù)。 修改抽象類如下:

public abstract class AbstractBusinessHandeler {

    public final void execute(){
        if(!isVip()){//如果顧客是vip,則不用排隊
            getRowNumber();
        }
        handle();
        judge();
    }

    public abstract boolean isVip();//抽象的鉤子方法,由子類實現(xiàn)

    private void getRowNumber(){
        System.out.println("rowNumber-00" + RandomUtils.nextInt());
    }

    public abstract void handle(); 

    private void judge(){
        System.out.println("give a praised");
    }
}

那么,他的實現(xiàn)類就可以根據(jù)具體情況來復(fù)寫其中的方法,然后同樣調(diào)用execute方法。

總結(jié)

1.模板方法模式是一種類的行為型模式,在它的結(jié)構(gòu)圖中只有類之間的繼承關(guān)系,沒有對象關(guān)聯(lián)關(guān)系。

2.模板方法模式是基于繼承的代碼復(fù)用基本技術(shù),模板方法模式的結(jié)構(gòu)和用法也是面向?qū)ο笤O(shè)計的核心之一。在模板方法模式中,可以將相同的代碼放在父類中,而將不同的方法實現(xiàn)放在不同的子類中。

3.在模板方法模式中,我們需要準(zhǔn)備一個抽象類,將部分邏輯以具體方法以及具體構(gòu)造函數(shù)的形式實現(xiàn),然后聲明一些抽象方法來讓子類實現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實現(xiàn)這些抽象方法,從而對剩余的邏輯有不同的實現(xiàn),這就是模板方法模式的用意。模板方法模式體現(xiàn)了面向?qū)ο蟮闹T多重要思想,是一種使用頻率較高的模式。

4.鉤子是一種方法,它在抽象類中不做事,或者是默認(rèn)的事情,子類可以選擇覆蓋它

5.為了防止子類改變模板方法中的算法骨架,一般將模板方法聲明為final

6.策略模式和模板方法都是用于封裝算法,前者是利用組合和委托模型,而后者則是繼承

到此這篇關(guān)于一文帶你厲害Java設(shè)計模式中的模板方法的文章就介紹到這了,更多相關(guān)Java模板方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring boot使用sharding jdbc的配置方式

    spring boot使用sharding jdbc的配置方式

    這篇文章主要介紹了spring boot使用sharding jdbc的配置方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • springboot下ueditor上傳功能的實現(xiàn)及遇到的問題

    springboot下ueditor上傳功能的實現(xiàn)及遇到的問題

    這篇文章主要介紹了springboot下ueditor上傳功能的實現(xiàn)及遇到的問題,本文分步驟通過實例截圖給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • Springboot+devtools配置熱部署過程

    Springboot+devtools配置熱部署過程

    SpringBoot提供的spring-boot-devtools模塊可以實現(xiàn)應(yīng)用的熱部署,極大提升開發(fā)效率,通過添加POM依賴、配置yml文件、使用IDE快捷鍵等步驟,可以無需手動重啟即可自動加載變更,這種方式不僅適用于靜態(tài)文件的自動加載,也適用于整個SpringBoot工程,是提高開發(fā)效率的有效手段
    2024-11-11
  • IDEA?下?Gradle?刪除多余無用依賴的處理方法

    IDEA?下?Gradle?刪除多余無用依賴的處理方法

    這篇文章主要介紹了IDEA下Gradle刪除多余無用依賴,使用該插件可以一定程度上幫助我們刪除無用依賴,但是也可能會多刪除有用的依賴,需要在使用插件自動修復(fù)后手動檢測項目,驗證是否會出現(xiàn)問題,避免導(dǎo)致上線發(fā)布錯誤的負(fù)優(yōu)化
    2022-03-03
  • java逗號分隔String字符串及數(shù)組、集合相互轉(zhuǎn)換

    java逗號分隔String字符串及數(shù)組、集合相互轉(zhuǎn)換

    我們在日常開發(fā)時會經(jīng)常遇到將一個字符串按照逗號進(jìn)行分割,這篇文章主要給大家介紹了關(guān)于java逗號分隔String字符串及數(shù)組、集合相互轉(zhuǎn)換的相關(guān)資料,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2024-02-02
  • java中List、Array、Map、Set等集合相互轉(zhuǎn)換

    java中List、Array、Map、Set等集合相互轉(zhuǎn)換

    這篇文章主要介紹了java中List、Array、Map、Set等集合相互轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 詳解如何有效地處理Java中的多線程

    詳解如何有效地處理Java中的多線程

    在現(xiàn)代軟件開發(fā)中,多線程編程已成為提高程序性能和響應(yīng)速度的重要手段,Java提供了豐富的多線程支持,使得在Java中實現(xiàn)并發(fā)操作變得相對簡單,本文將深入探討Java多線程編程的基本概念、常見問題和最佳實踐,需要的朋友可以參考下
    2024-06-06
  • Hadoop源碼分析三啟動及腳本剖析

    Hadoop源碼分析三啟動及腳本剖析

    本篇是Hadoop源碼分析系列文章第三篇,主要介紹Hadoop啟動以及腳本的剖析,后續(xù)本系列文章會持續(xù)更新,有需要的朋友可以借鑒參考下
    2021-09-09
  • 詳解JavaSE中抽象類與接口的定義及使用

    詳解JavaSE中抽象類與接口的定義及使用

    這篇文章主要為大家詳細(xì)介紹了JavaSe的抽象類和接口,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-07-07
  • Java面試必考的關(guān)鍵字的用法匯總

    Java面試必考的關(guān)鍵字的用法匯總

    這篇文章主要為大家詳細(xì)介紹了Java中的幾種關(guān)鍵字相關(guān)知識,本文比較適合剛?cè)肟覬ava的小白以及準(zhǔn)備秋招的大佬閱讀,需要的小伙伴快收藏起來吧
    2023-06-06

最新評論

河津市| 浮梁县| 富宁县| 四子王旗| 西乌珠穆沁旗| 阿克| 盱眙县| 十堰市| 桐梓县| 彰化市| 香河县| 湖南省| 即墨市| 弥渡县| 将乐县| 宁明县| 新平| 临江市| 桃江县| 犍为县| 隆尧县| 会昌县| 昌都县| 新丰县| 无为县| 广元市| 平乐县| 永善县| 阳谷县| 莱阳市| 建瓯市| 北流市| 扎鲁特旗| 东安县| 莒南县| 塔河县| 准格尔旗| 石嘴山市| 荔浦县| 锡林郭勒盟| 承德市|