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

Java設(shè)計(jì)模式之Template?Pattern模板模式詳解

 更新時(shí)間:2023年10月09日 08:33:49   作者:十維豆腦  
這篇文章主要介紹了Java設(shè)計(jì)模式之Template?Pattern模板模式詳解,模板模式(Template?Pattern)行為型模式之一,抽象父類(lèi)定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類(lèi)中,需要的朋友可以參考下

一、定義

模板模式(Template Pattern):行為型模式之一,抽象父類(lèi)定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類(lèi)中。

二、UML類(lèi)圖

在這里插入圖片描述

三、角色職責(zé)

抽象類(lèi)/抽象模板(Abstract Class):抽象模板類(lèi),負(fù)責(zé)給出一個(gè)算法的輪廓和骨架。 它

由一個(gè)模板方法和若干個(gè)基本方法構(gòu)成。這些方法的定義如下:

  • 模板方法:定義了一套算法的骨架,按某種順序調(diào)用其包含的基本方法。
  • 基本方法:是算法骨架/流程的某些步驟進(jìn)行具體實(shí)現(xiàn),包含以下幾種類(lèi)型,
  • 抽象方法:在抽象類(lèi)中聲明,由具體子類(lèi)實(shí)現(xiàn)。 具體方法:在抽象類(lèi)中已經(jīng)實(shí)現(xiàn),在具體子類(lèi)中可以繼承或重寫(xiě)它。
  • 鉤子方法:在抽象類(lèi)中已經(jīng)實(shí)現(xiàn),包括用于判斷的邏輯方法和需要子類(lèi)重寫(xiě)的空方法兩種。

具體子類(lèi)/具體實(shí)現(xiàn)(Concrete Class):具體實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)抽象類(lèi)中所定義的抽象方法和鉤子方法,它們是一個(gè)頂級(jí)邏輯的一個(gè)組成步驟。

四、代碼實(shí)現(xiàn)

前言:在平時(shí)工作中就經(jīng)常會(huì)用到模板方法,就像我們公司的框架里使用的Excel導(dǎo)入功能EasyExcel,就是一個(gè)非常典型的模板方法,我們通常會(huì)頂一個(gè)抽象類(lèi)并在里面規(guī)定出一些模板方法和基本方法,再由具體的實(shí)現(xiàn)類(lèi)去進(jìn)行調(diào)用或者重寫(xiě),下面就用代碼給大家舉個(gè)栗子。

導(dǎo)入抽象類(lèi)(抽象類(lèi) Abstract Class)

abstract class ImportAbstractClass {
    public void TemplateMethod() {
        validateColumn();
        validateField();
        bizHandle();
    }
    public void validateColumn() {
        System.out.println("校驗(yàn)導(dǎo)入Excel的列名...");
    }
    public abstract void validateField();
    public abstract void bizHandle();
}

導(dǎo)入訂單實(shí)現(xiàn)類(lèi)(具體子類(lèi) Concrete Class)

public class ImportOrderClass extends ImportAbstractClass {
    @Override
    public void validateField() {
        System.out.println("校驗(yàn)導(dǎo)入訂單字段...");
    }
    @Override
    public void bizHandle() {
        System.out.println("訂單業(yè)務(wù)處理...");
    }
}

導(dǎo)入商品實(shí)現(xiàn)類(lèi)(具體子類(lèi) Concrete Class)

public class ImportProductClass extends ImportAbstractClass {
    @Override
    public void validateField() {
        System.out.println("校驗(yàn)導(dǎo)入商品字段...");
    }
    @Override
    public void bizHandle() {
        System.out.println("商品業(yè)務(wù)處理...");
    }
}

測(cè)試類(lèi)

public class TemplateTest {
    public static void main(String[] args) {
        ImportAbstractClass order = new ImportOrderClass();
        order.TemplateMethod();
        ImportAbstractClass product = new ImportProductClass();
        product.TemplateMethod();
    }
}

輸出結(jié)果

校驗(yàn)導(dǎo)入Excel的列名...
校驗(yàn)導(dǎo)入訂單字段...
訂單業(yè)務(wù)處理...
校驗(yàn)導(dǎo)入Excel的列名...
校驗(yàn)導(dǎo)入商品字段...
商品業(yè)務(wù)處理...

五、源碼分析

模板模式的應(yīng)用場(chǎng)景非常多,就比如我們常用的MyBatis中的BaseExecutor類(lèi)就使用到了模板模式。

在這里插入圖片描述

在主流程中,我們可以直接調(diào)用query方法,也可以通過(guò)實(shí)現(xiàn)抽象方法doQuery進(jìn)行使用。

六、優(yōu)缺點(diǎn)分析

優(yōu)點(diǎn):

  • 不變部分封裝到父類(lèi)實(shí)現(xiàn),而把可變部分由子類(lèi)繼承實(shí)現(xiàn),便于子類(lèi)繼續(xù)擴(kuò)展。
  • 在父類(lèi)中提取了公共的部分代碼,便于代碼復(fù)用。
  • 部分方法是由子類(lèi)實(shí)現(xiàn)的,因此子類(lèi)可以通過(guò)擴(kuò)展方式增加相應(yīng)的功能,符合開(kāi)閉原則。

缺點(diǎn):

  • 對(duì)每個(gè)不同的實(shí)現(xiàn)都需要定義一個(gè)子類(lèi),導(dǎo)致類(lèi)的個(gè)數(shù)增加,系統(tǒng)更龐大,設(shè)計(jì)更抽象。
  • 父類(lèi)中的抽象方法由子類(lèi)實(shí)現(xiàn),子類(lèi)執(zhí)行的結(jié)果會(huì)影響父類(lèi)的結(jié)果,它提高了代碼閱讀的難度。

七、適用場(chǎng)景

  • 多個(gè)子類(lèi)有共有的方法,并且邏輯基本相同。
  • 重要、復(fù)雜的算法,可以把核心算法設(shè)計(jì)為模板方法,周邊的相關(guān)細(xì)節(jié)功能則由各個(gè)子類(lèi)實(shí)現(xiàn)。

八、總結(jié)

當(dāng)我們要完成在某一細(xì)節(jié)層次一致的一個(gè)過(guò)程或一系列步驟,但其個(gè)別步驟在更詳細(xì)的層次上的實(shí)現(xiàn)可能不同時(shí),我們通??紤]模板方法模式來(lái)處理。模板模式只是在一定程度上完成了解耦的操作,當(dāng)不變的和可變的行為在方法的子類(lèi)實(shí)現(xiàn)中混合在一起的時(shí)候,不變的行為就會(huì)在子類(lèi)中重復(fù)出現(xiàn)。我們通過(guò)模板方法模式把這些行文搬移到單一的地方(提取公有部分,抽象成抽象方法),這樣就幫助子類(lèi)擺脫重復(fù)的不變行為的糾纏。

到此這篇關(guān)于Java設(shè)計(jì)模式之Template Pattern模板模式詳解的文章就介紹到這了,更多相關(guān)Template Pattern模板模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中避免空指針的幾種方法解析

    Java中避免空指針的幾種方法解析

    這篇文章主要介紹了Java中避免空指針的幾種方法解析,Java 中任何對(duì)象都有可能為空,當(dāng)我們調(diào)用空對(duì)象的方法時(shí)就會(huì)拋出 NullPointerException 空指針異常,這是一種非常常見(jiàn)的錯(cuò)誤類(lèi)型,需要的朋友可以參考下
    2023-12-12
  • 三種Spring BeanName生成器,你了解嗎

    三種Spring BeanName生成器,你了解嗎

    無(wú)論我們是通過(guò) XML 文件,還是 Java 代碼,亦或是包掃描的方式去注冊(cè) Bean,都可以不設(shè)置BeanName,而Spring均會(huì)為之提供默認(rèn)的 beanName,本文我們就來(lái)看看 Spring 中三種處理不同情況的 beanName生成器吧
    2023-09-09
  • @PathVariable獲取路徑中帶有 / 斜杠的解決方案

    @PathVariable獲取路徑中帶有 / 斜杠的解決方案

    這篇文章主要介紹了@PathVariable獲取路徑中帶有 / 斜杠的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Spring?Boot集成LiteFlow規(guī)則引擎的詳細(xì)過(guò)程

    Spring?Boot集成LiteFlow規(guī)則引擎的詳細(xì)過(guò)程

    本文詳細(xì)介紹了如何在Spring?Boot應(yīng)用程序中集成LiteFlow規(guī)則引擎,并探討如何使用LiteFlow庫(kù)來(lái)實(shí)現(xiàn)業(yè)務(wù)流程的規(guī)則處理,將通過(guò)具體的示例來(lái)展示如何在Spring?Boot應(yīng)用程序中配置和使用LiteFlow規(guī)則引擎,以提高系統(tǒng)的靈活性和可維護(hù)性,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • Java將一個(gè)正整數(shù)分解質(zhì)因數(shù)的代碼

    Java將一個(gè)正整數(shù)分解質(zhì)因數(shù)的代碼

    這篇文章主要介紹了將一個(gè)正整數(shù)分解質(zhì)因數(shù)。例如:輸入90,打印出90=2*3*3*5,需要的朋友可以參考下
    2017-02-02
  • Java文件上傳與文件下載實(shí)現(xiàn)方法詳解

    Java文件上傳與文件下載實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了Java文件上傳與文件下載實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Java文件上傳與文件下載相關(guān)操作原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-02-02
  • Java?MyBatis之Mapper代理詳解

    Java?MyBatis之Mapper代理詳解

    這篇文章主要介紹了Java?web中MyBatis的mapper代理,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2023-04-04
  • java8保姆級(jí)lambda表達(dá)式教程

    java8保姆級(jí)lambda表達(dá)式教程

    這篇文章主要介紹了Java8之后的Lambda表達(dá)式的用法,lambda表達(dá)式將大量替代匿名內(nèi)部類(lèi)的使用,簡(jiǎn)化代碼的同時(shí),更突出了原來(lái)匿名內(nèi)部類(lèi)中最重要的那部分包含真正邏輯的代碼,需要的朋友可以參考下
    2023-03-03
  • maven項(xiàng)目install時(shí)忽略執(zhí)行test方法的總結(jié)

    maven項(xiàng)目install時(shí)忽略執(zhí)行test方法的總結(jié)

    這篇文章主要介紹了maven項(xiàng)目install時(shí)忽略執(zhí)行test方法的總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java代碼混淆工具ProGuard使用指南(附有1.8以上和以下使用工具)

    Java代碼混淆工具ProGuard使用指南(附有1.8以上和以下使用工具)

    ProGuard是一個(gè)開(kāi)源的Java?class文件縮小器、優(yōu)化器、混淆器和預(yù)驗(yàn)證器,它通過(guò)刪除未使用的類(lèi)、字段、方法和屬性,優(yōu)化字節(jié)碼指令,并重命名類(lèi)、字段和方法,使反編譯后的代碼難以理解,從而提高應(yīng)用的安全性,本文給大家詳細(xì)介紹了ProGuard使用指南,需要的朋友可以參考下
    2025-05-05

最新評(píng)論

龙胜| 绥化市| 陈巴尔虎旗| 密山市| 灵山县| 南和县| 东乡| 正蓝旗| 菏泽市| 唐河县| 大关县| 平顶山市| 墨脱县| 定南县| 上林县| 海南省| 武安市| 古丈县| 贵港市| 和硕县| 灵丘县| 白朗县| 阜新| 汝南县| 和田县| 思茅市| 仁布县| 深泽县| 綦江县| 南澳县| 永修县| 昔阳县| 古交市| 南部县| 凤城市| 峨边| 南昌县| 秦安县| 娄底市| 襄城县| 海安县|