亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java通俗易懂系列設(shè)計模式之模板模式

 更新時間:2021年04月23日 08:55:45   作者:JaJian  
這篇文章主要介紹了Java通俗易懂系列設(shè)計模式之模板模式,想了解設(shè)計模式的同學(xué),可以仔細看一下

實際開發(fā)中常常會遇到,代碼骨架類似甚至相同,只是具體的實現(xiàn)不一樣的場景。例如:流程都有開啟、編輯、駁回、結(jié)束。每個流程都包含這幾個步驟,不同的是不同的流程實例它們的內(nèi)容不一樣。共享單車都是先開鎖、騎行、上鎖、付款。這些大的步驟固定,不同的是每個實例的具體實現(xiàn)細節(jié)不一樣。這些類似的業(yè)務(wù)我們都可以使用模板模式實現(xiàn)。為什么要使用模板模式以及如何使用呢?

介紹

定義:在模板模式(Template Pattern)中,一個抽象類公開定義了執(zhí)行它的方法的方式/模板。它的子類可以按需要重寫方法實現(xiàn),但調(diào)用將以抽象類中定義的方式進行。這種類型的設(shè)計模式屬于行為型模式。

意圖:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟

  • 主要解決:一些方法通用,卻在每一個子類都重新寫了這一方法。
  • 何時使用:有一些通用的方法。
  • 如何解決:將這些通用算法抽象出來。
  • 關(guān)鍵代碼:在抽象類實現(xiàn),其他步驟在子類實現(xiàn)。

實現(xiàn)

我們以生活中買菜做飯的例子來寫個Demo,燒飯一般都是買菜、洗菜、烹飪、裝盤四大過程。中國自古有八大菜系,制作方式肯定都避不開這四個過程。那在模板模式中如何實現(xiàn)呢?
創(chuàng)建一個抽象類,它的模板方法被設(shè)置為 final。為防止惡意操作,一般模板方法都加上 final 關(guān)鍵詞。

public abstract class AbstractCookingService {
    //買菜
    protected abstract void shopping();
    //清洗
    protected abstract void wash();
    //烹飪
    protected abstract void cooking();
    //裝盤
    protected abstract void dishedUp();

    public final void process() {
        shopping();
        wash();
        cooking();
        dishedUp();
    }
}

創(chuàng)建實現(xiàn)了上述抽象類的子類。
// 徽菜烹飪

/**
 * 徽菜制作大廚
 */
public class HuiCaiChef extends AbstractCookingService {

    @Override
    protected void shopping() {
        System.out.println("買菜:新鮮魚一條,紅辣椒五兩");
    }

    @Override
    protected void wash() {
        System.out.println("清洗:紅椒洗凈切片,魚頭半分");
    }

    @Override
    protected void cooking() {
        System.out.println("烹飪:魚頭水蒸,辣椒過油");
    }

    @Override
    protected void dishedUp() {
        System.out.println("裝盤:用長形盤子裝盛");
    }
}

// 川菜烹制

/**
 * 川菜制作大廚
 */
public class HuiCaiChef extends AbstractCookingService {

    @Override
    protected void shopping() {
        System.out.println("買菜:黑豬肉一斤,蒜頭5個");
    }

    @Override
    protected void wash() {
        System.out.println("清洗:豬肉洗凈,蒜頭去皮");
    }

    @Override
    protected void cooking() {
        System.out.println("烹飪:大火翻炒,慢火悶油");
    }

    @Override
    protected void dishedUp() {
        System.out.println("裝盤:深碗盛起,熱油澆拌");
    }
}

使用 TemplatePatternDemo 類執(zhí)行模板方法 process() 來演示烹飪的定義方式。

public class TemplatePatternDemo {

    public static void main(String[] args) {
        System.out.println("----------川菜制作------------");
        AbstractCookingService chuanCaiService = new ChuanCaiChef();
        chuanCaiService.process();
        System.out.println("-----------徽菜制作-----------");
        AbstractCookingService huiCaiService = new HuiCaiChef();
        huiCaiService.process();
    }
}

執(zhí)行程序,輸出結(jié)果:

----------川菜制作------------

買菜:新鮮魚一條,紅辣椒五兩

清洗:紅椒洗凈切片,魚頭半分

烹飪:魚頭水蒸,辣椒過油

裝盤:用長形盤子裝盛

-----------徽菜制作-----------

買菜:黑豬肉一斤,蒜頭5個

清洗:豬肉洗凈,蒜頭去皮

烹飪:大火翻炒,慢火悶油

從以上實例可以看出,其實模板模式也沒什么高深莫測的,簡單來說就是三大步驟:

  1. 創(chuàng)建一個抽象類,定義幾個抽象方法和一個final修飾的模板方法,而模板方法中設(shè)定了抽象方法的執(zhí)行順序或邏輯。
  2. 無論子類有多少個,只需要繼承該抽象類,實現(xiàn)父類的抽象方法重寫自己的業(yè)務(wù)。
  3. 根據(jù)不同的需求創(chuàng)建不同的子類實現(xiàn),每次調(diào)用的地方只需調(diào)用模板方法,即可完成特定的模板流程。

總結(jié)

從以上的分析和Demo我們可以看到,模板方法提高了我們的代碼的可維護性和可擴展性。有優(yōu)點也有缺點。
優(yōu)點:

  1. 封裝不變部分,擴展可變部分。
  2. 提取公共代碼,便于維護。
  3. 行為由父類控制,子類實現(xiàn)。

缺點:

每一個不同的實現(xiàn)都需要一個子類來實現(xiàn),導(dǎo)致類的個數(shù)增加,使得系統(tǒng)更加龐大。

使用場景:

  • 有多個子類共有的方法,且邏輯相同。
  • 重要的、復(fù)雜的方法,可以考慮作為模板方法。

以上就是Java通俗易懂系列設(shè)計模式之模板模式的詳細內(nèi)容,更多關(guān)于Java設(shè)計模式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MyBatis框架底層的執(zhí)行原理源碼解析

    MyBatis框架底層的執(zhí)行原理源碼解析

    這篇文章主要介紹了MyBatis框架底層的執(zhí)行原理源碼解析,本文通過圖文實例代碼相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Java的Semaphore信號量使用及原理解讀

    Java的Semaphore信號量使用及原理解讀

    這篇文章主要介紹了Java的Semaphore信號量使用及原理解讀,Semaphore(信號量)是Java中一個并發(fā)控制工具,用于控制對共享資源的訪問,它基于計數(shù)器的原理,可以限制同時訪問某個資源的線程數(shù)量,需要的朋友可以參考下
    2023-12-12
  • MyBatis discriminator標簽原理實例解析

    MyBatis discriminator標簽原理實例解析

    這篇文章主要為大家介紹了MyBatis discriminator標簽實現(xiàn)原理實例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Java Spring快速入門

    Java Spring快速入門

    本文主要介紹了SpringSpring簡介和入門知識。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • java實現(xiàn)簡單銀行家算法

    java實現(xiàn)簡單銀行家算法

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單銀行家算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • springboot 跨域配置類及跨域請求配置

    springboot 跨域配置類及跨域請求配置

    這篇文章主要介紹了springboot 跨域配置類及跨域請求配置,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • Caused?by:?java.lang.NumberFormatException:?For?input?string:?“port“(問題解決)

    Caused?by:?java.lang.NumberFormatException:?For?input?s

    這篇文章主要介紹了Caused?by:?java.lang.NumberFormatException:?For?input?string:?“port“,本文給大家分享完美解決方法,需要的朋友可以參考下
    2023-01-01
  • IDEA?2021.3?使用及idea2021.3.1激活使用方法

    IDEA?2021.3?使用及idea2021.3.1激活使用方法

    IDEA?全稱?IntelliJ?IDEA,是java語言開發(fā)的集成環(huán)境,IntelliJ在業(yè)界被公認為最好的java開發(fā)工具之一,今天通過本文給大家介紹idea2021.3.1激活及使用教程,感興趣的朋友一起看看吧
    2022-01-01
  • Java中關(guān)于 null 的幾種處理方式詳解

    Java中關(guān)于 null 的幾種處理方式詳解

    這篇文章主要介紹了Java中關(guān)于 null 的幾種處理方式,關(guān)于 null ,你應(yīng)該知道下面這幾件事情來有效的了解 null ,從而避免很多由 null 引起的錯誤,具體細節(jié)跟隨小編一起學(xué)習(xí)下吧
    2021-10-10
  • 詳解使用Java代碼讀取并比較本地兩個txt文件區(qū)別

    詳解使用Java代碼讀取并比較本地兩個txt文件區(qū)別

    這篇文章主要為大家介紹了使用Java代碼讀取并比較本地兩個txt文件區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07

最新評論