欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

概念

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

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

舉例

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

/**
 * 模板方法設計模式的抽象類
 * @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è)務
     */
    public abstract void handle(); //抽象的辦理業(yè)務方法,由子類實現
    /**
     * 評價
     */
    private void judge(){
        System.out.println("give a praised");
    }
}

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

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

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

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

鉤子方法

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

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

public abstract class AbstractBusinessHandeler {

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

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

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

    public abstract void handle(); 

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

那么,他的實現類就可以根據具體情況來復寫其中的方法,然后同樣調用execute方法。

總結

1.模板方法模式是一種類的行為型模式,在它的結構圖中只有類之間的繼承關系,沒有對象關聯關系。

2.模板方法模式是基于繼承的代碼復用基本技術,模板方法模式的結構和用法也是面向對象設計的核心之一。在模板方法模式中,可以將相同的代碼放在父類中,而將不同的方法實現放在不同的子類中。

3.在模板方法模式中,我們需要準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,然后聲明一些抽象方法來讓子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現,這就是模板方法模式的用意。模板方法模式體現了面向對象的諸多重要思想,是一種使用頻率較高的模式。

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

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

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

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

相關文章

  • JAVA操作HDFS案例的簡單實現

    JAVA操作HDFS案例的簡單實現

    本篇文章主要介紹了JAVA操作HDFS案例的簡單實現,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Spring Boot學習入門之統一異常處理詳解

    Spring Boot學習入門之統一異常處理詳解

    我們在做Web應用的時候,請求處理過程中發(fā)生錯誤是非常常見的情況。下面這篇文章主要給大家介紹了關于Spring Boot學習入門之統一異常處理的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-09-09
  • Java?不同版本的?Switch語句

    Java?不同版本的?Switch語句

    本文主要介紹了Java不同版本的Switch語句,自Java13以來,Switch表達式就被添加到Java核心庫中,下面我們將介紹舊的Java?Switch語句和新的Switch語句的區(qū)別,需要的朋友可以參考一下
    2022-06-06
  • Java方法的參數傳遞機制詳解

    Java方法的參數傳遞機制詳解

    這篇文章主要介紹了Java方法的參數傳遞機制詳解,對于Java初學者來說,剛學習Java的時候可能經常會聽到調用方法時參數的值傳遞與引用傳遞,但是,實際上Java中方法的參數傳遞機制只有值傳遞,需要的朋友可以參考下
    2024-01-01
  • Java中的@Repeatable注解使用詳解

    Java中的@Repeatable注解使用詳解

    這篇文章主要介紹了Java中的@Repeatable注解使用詳解,@Repeatable注解是java8為了解決同一個注解不能重復在同一類/方法/屬性上使用的問題,本文提供了解決思路和部分實現代碼,需要的朋友可以參考下
    2024-02-02
  • Hibernate連接三種數據庫的配置文件

    Hibernate連接三種數據庫的配置文件

    今天小編就為大家分享一篇關于Hibernate連接三種數據庫的配置文件,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 解決mybatis竟然報Invalid value for getInt()的問題

    解決mybatis竟然報Invalid value for getInt()的問題

    使用mybatis遇到一個非常奇葩的問題,總是報Invalid value for getInt()的問題,怎么解決呢?下面小編通過場景分析給大家代來了mybatis報Invalid value for getInt()的解決方法,感興趣的朋友參考下吧
    2021-10-10
  • 詳解Java中的HashTable

    詳解Java中的HashTable

    這篇文章主要介紹了Java中的HashTable的相關資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • 關于IDEA使用jsp可以訪問頁面轉換為html彈出頁面為404的問題

    關于IDEA使用jsp可以訪問頁面轉換為html彈出頁面為404的問題

    這篇文章主要介紹了關于IDEA使用jsp可以訪問頁面轉換為html彈出頁面為404的問題及解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java 深入分析鏈表面試實例題目

    Java 深入分析鏈表面試實例題目

    鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的,本篇帶你通過兩個實例題目來深入探索
    2022-03-03

最新評論