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

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

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

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

介紹

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

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

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

實(shí)現(xiàn)

我們以生活中買菜做飯的例子來(lái)寫個(gè)Demo,燒飯一般都是買菜、洗菜、烹飪、裝盤四大過(guò)程。中國(guó)自古有八大菜系,制作方式肯定都避不開這四個(gè)過(guò)程。那在模板模式中如何實(shí)現(xiàn)呢?
創(chuàng)建一個(gè)抽象類,它的模板方法被設(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)建實(shí)現(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("烹飪:魚頭水蒸,辣椒過(guò)油");
    }

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

// 川菜烹制

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

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

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

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

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

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

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é)果:

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

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

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

烹飪:魚頭水蒸,辣椒過(guò)油

裝盤:用長(zhǎng)形盤子裝盛

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

買菜:黑豬肉一斤,蒜頭5個(gè)

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

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

從以上實(shí)例可以看出,其實(shí)模板模式也沒什么高深莫測(cè)的,簡(jiǎn)單來(lái)說(shuō)就是三大步驟:

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

總結(jié)

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

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

缺點(diǎn):

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

使用場(chǎng)景:

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

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

相關(guān)文章

  • 徹底解決tomcat中文亂碼問(wèn)題方案

    徹底解決tomcat中文亂碼問(wèn)題方案

    這篇文章主要介紹了徹底解決tomcat中文亂碼問(wèn)題方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • SSH框架實(shí)現(xiàn)表單上傳圖片實(shí)例代碼

    SSH框架實(shí)現(xiàn)表單上傳圖片實(shí)例代碼

    本篇文章主要介紹了SSH框架實(shí)現(xiàn)表單上傳圖片實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Java實(shí)現(xiàn)超簡(jiǎn)單抖音去水印的示例詳解

    Java實(shí)現(xiàn)超簡(jiǎn)單抖音去水印的示例詳解

    抖音去水印方法很簡(jiǎn)單,以前一直沒有去研究,以為搞個(gè)去水印還要用到算法去除,直到動(dòng)手的時(shí)候才發(fā)現(xiàn)這么簡(jiǎn)單,不用編程基礎(chǔ)都能做。所以本文將介紹一個(gè)超簡(jiǎn)單抖音視頻去水印方法,需要的可以參考一下
    2022-03-03
  • 詳解Spring Security中獲取當(dāng)前登錄用戶的詳細(xì)信息的幾種方法

    詳解Spring Security中獲取當(dāng)前登錄用戶的詳細(xì)信息的幾種方法

    本文主要介紹了詳解Spring Security中獲取當(dāng)前登錄用戶的詳細(xì)信息的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Spring Boot 中的 SockJS原理及使用方法

    Spring Boot 中的 SockJS原理及使用方法

    SockJS 的主要作用是提供一種 WebSocket 的兼容性解決方案,使得不支持 WebSocket 的瀏覽器也可以使用 WebSocket,本文介紹了Spring Boot中的SockJS,包括SockJS的原理,使用方法和示例代碼,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • JDK 7U15在 Windows x86平臺(tái)下的安裝方法

    JDK 7U15在 Windows x86平臺(tái)下的安裝方法

    本文給大家分享的是如何在windows平臺(tái)下安裝JDK最新版的方法,十分的簡(jiǎn)單全面,有需要的小伙伴可以參考下
    2016-05-05
  • java實(shí)現(xiàn)馬踏棋盤的完整版

    java實(shí)現(xiàn)馬踏棋盤的完整版

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)馬踏棋盤的完整版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 解決spring.thymeleaf.cache=false不起作用的問(wèn)題

    解決spring.thymeleaf.cache=false不起作用的問(wèn)題

    這篇文章主要介紹了解決spring.thymeleaf.cache=false不起作用的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • JAVA中的for循環(huán)幾種使用方法講解

    JAVA中的for循環(huán)幾種使用方法講解

    這篇文章主要介紹了JAVA中的for循環(huán)幾種使用方法講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • JAVA按字節(jié)讀取文件的簡(jiǎn)單實(shí)例

    JAVA按字節(jié)讀取文件的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇JAVA按字節(jié)讀取文件的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08

最新評(píng)論

肇州县| 阆中市| 徐水县| 军事| 乌鲁木齐市| 普兰店市| 通海县| 竹山县| 永胜县| 永胜县| 建水县| 烟台市| 巴马| 河南省| 且末县| 黑龙江省| 凌源市| 年辖:市辖区| 三穗县| 锦州市| 吉首市| 清水河县| 临海市| 沙坪坝区| 平山县| 军事| 盐亭县| 孟村| 济南市| 句容市| 南城县| 常德市| 大足县| 邵武市| 贵港市| 富民县| 随州市| 三穗县| 光泽县| 马边| 延边|