国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java通俗易懂系列設計模式之模板模式

發(fā)布時(shí)間:2021-07-17 21:51 來(lái)源:腳本之家 閱讀:0 作者:JaJian 欄目: 編程語(yǔ)言 歡迎投稿:712375056

目錄

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

介紹

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

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

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

實(shí)現

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

public abstract class AbstractCookingService {
    //買(mǎi)菜
    protected abstract void shopping();
    //清洗
    protected abstract void wash();
    //烹飪
    protected abstract void cooking();
    //裝盤(pán)
    protected abstract void dishedUp();

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

創(chuàng )建實(shí)現了上述抽象類(lèi)的子類(lèi)。
// 徽菜烹飪

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

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

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

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

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

// 川菜烹制

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

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

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

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

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

使用 TemplatePatternDemo 類(lèi)執行模板方法 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();
    }
}

執行程序,輸出結果:

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

買(mǎi)菜:新鮮魚(yú)一條,紅辣椒五兩

清洗:紅椒洗凈切片,魚(yú)頭半分

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

裝盤(pán):用長(cháng)形盤(pán)子裝盛

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

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

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

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

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

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

總結

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

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

缺點(diǎn):

每一個(gè)不同的實(shí)現都需要一個(gè)子類(lèi)來(lái)實(shí)現,導致類(lèi)的個(gè)數增加,使得系統更加龐大。

使用場(chǎng)景:

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

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

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

久久97超碰色中文字幕蜜芽| 农村人乱弄一区二区| 又色又爽又黄的三级视频| 永久免费AV无码不卡在线观看| 手机永久无码国产AV毛片| 三级理论中文字幕在线播放|