国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Gof23設(shè)計(jì)模式之模板方法模式

這篇具有很好參考價(jià)值的文章主要介紹了Gof23設(shè)計(jì)模式之模板方法模式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.定義

定義一個(gè)操作中的算法骨架,而將算法的一些步驟延遲到子類(lèi)中,使得子類(lèi)可以不改變?cè)撍惴ńY(jié)構(gòu)的情況下重定義該算法的某些特定步驟。

2.結(jié)構(gòu)

模板方法(Template Method)模式包含以下主要角色:

  • 抽象類(lèi)(Abstract Class):負(fù)責(zé)給出一個(gè)算法的輪廓和骨架。它由一個(gè)模板方法和若干個(gè)基本方法構(gòu)成。

    • 模板方法:定義了算法的骨架,按某種順序調(diào)用其包含的基本方法。

    • 基本方法:是實(shí)現(xiàn)算法各個(gè)步驟的方法,是模板方法的組成部分?;痉椒ㄓ挚梢苑譃槿N:

      • 抽象方法(Abstract Method) :一個(gè)抽象方法由抽象類(lèi)聲明、由其具體子類(lèi)實(shí)現(xiàn)。

      • 具體方法(Concrete Method) :一個(gè)具體方法由一個(gè)抽象類(lèi)或具體類(lèi)聲明并實(shí)現(xiàn),其子類(lèi)可以進(jìn)行覆蓋也可以直接繼承。

      • 鉤子方法(Hook Method) :在抽象類(lèi)中已經(jīng)實(shí)現(xiàn),包括用于判斷的邏輯方法和需要子類(lèi)重寫(xiě)的空方法兩種。

        一般鉤子方法是用于判斷的邏輯方法,這類(lèi)方法名一般為isXxx,返回值類(lèi)型為boolean類(lèi)型。

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

3.案例實(shí)現(xiàn)

/**
 * @author 曉風(fēng)殘?jiān)翷x
 * @date 2023/7/21 16:47
 *      抽象類(lèi)(定義模板方法和基本方法)
 */
public abstract class AbstractClass {

    // 模板方法  加上final不讓子類(lèi)改變方法結(jié)構(gòu)
    public final void cookProcess() {
        // 第一步,倒油
        this.pourOil();
        // 第二步,熱油
        this.heatOil();
        // 第三步,倒蔬菜
        this.pourVegetable();
        // 第四步,倒調(diào)味料
        this.pourSauce();
        // 第五步,翻炒
        this.fry();
    }

    // 抽象方法
    public abstract void pourSauce();

    public abstract void pourVegetable();


    // 具體方法
    private void fry() {
        System.out.println("翻炒");
    }

    private void heatOil() {
        System.out.println("熱油");
    }

    private void pourOil() {
        System.out.println("倒油");
    }

}

/**
 * @author 曉風(fēng)殘?jiān)翷x
 * @date 2023/7/25 0:46
 *      炒包菜類(lèi)  具體的類(lèi)
 */
public class ConcreteClass_BaoCai extends AbstractClass {
    @Override
    public void pourSauce() {
        System.out.println("下鍋的醬料是辣椒");
    }

    @Override
    public void pourVegetable() {
        System.out.println("下鍋的蔬菜是包菜");
    }
}

/**
 * @author 曉風(fēng)殘?jiān)翷x
 * @date 2023/7/25 0:46
 *      炒菜芯類(lèi)  具體的類(lèi)
 */
public class ConcreteClass_CaiXin extends AbstractClass {
    @Override
    public void pourSauce() {
        System.out.println("下鍋的醬料是蒜蓉");
    }

    @Override
    public void pourVegetable() {
        System.out.println("下鍋的蔬菜是菜芯");
    }
}

/**
 * @author 曉風(fēng)殘?jiān)翷x
 * @date 2023/7/25 0:48
 */
public class Client {

    public static void main(String[] args) {
        // 炒包菜
        // 創(chuàng)建對(duì)象
        ConcreteClass_BaoCai baoCai = new ConcreteClass_BaoCai();
        baoCai.cookProcess();

        // 炒菜芯
        ConcreteClass_CaiXin caiXin = new ConcreteClass_CaiXin();
        caiXin.cookProcess();
    }
}

4.優(yōu)缺點(diǎn)

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

  • 提高代碼復(fù)用性

    將相同部分的代碼放在抽象的父類(lèi)中,而將不同的代碼放入不同的子類(lèi)中。

  • 實(shí)現(xiàn)了反向控制

    通過(guò)一個(gè)父類(lèi)調(diào)用其子類(lèi)的操作,通過(guò)對(duì)子類(lèi)的具體實(shí)現(xiàn)擴(kuò)展不同的行為,實(shí)現(xiàn)了反向控制 ,并符合“開(kāi)閉原則”。

缺點(diǎn):

  • 對(duì)每個(gè)不同的實(shí)現(xiàn)都需要定義一個(gè)子類(lèi),這會(huì)導(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é)果,這導(dǎo)致一種反向的控制結(jié)構(gòu),它提高了代碼閱讀的難度。

5.使用場(chǎng)景

  • 算法的整體步驟很固定,但其中個(gè)別部分易變時(shí),這時(shí)候可以使用模板方法模式,將容易變的部分抽象出來(lái),供子類(lèi)實(shí)現(xiàn)。
  • 需要通過(guò)子類(lèi)來(lái)決定父類(lèi)算法中某個(gè)步驟是否執(zhí)行,實(shí)現(xiàn)子類(lèi)對(duì)父類(lèi)的反向控制。

6.JDK源碼解析

InputStream類(lèi)就使用了模板方法模式。在InputStream類(lèi)中定義了多個(gè) read() 方法,如下:

public abstract class InputStream implements Closeable {
    //抽象方法,要求子類(lèi)必須重寫(xiě)
    public abstract int read() throws IOException;

    public int read(byte b[]) throws IOException {
        return read(b, 0, b.length);
    }

    public int read(byte b[], int off, int len) throws IOException {
        if (b == null) {
            throw new NullPointerException();
        } else if (off < 0 || len < 0 || len > b.length - off) {
            throw new IndexOutOfBoundsException();
        } else if (len == 0) {
            return 0;
        }

        int c = read(); //調(diào)用了無(wú)參的read方法,該方法是每次讀取一個(gè)字節(jié)數(shù)據(jù)
        if (c == -1) {
            return -1;
        }
        b[off] = (byte)c;

        int i = 1;
        try {
            for (; i < len ; i++) {
                c = read();
                if (c == -1) {
                    break;
                }
                b[off + i] = (byte)c;
            }
        } catch (IOException ee) {
        }
        return i;
    }
}

從上面代碼可以看到,無(wú)參的 read() 方法是抽象方法,要求子類(lèi)必須實(shí)現(xiàn)。而 read(byte b[]) 方法調(diào)用了 read(byte b[], int off, int len) 方法,所以在此處重點(diǎn)看的方法是帶三個(gè)參數(shù)的方法。

在該方法中第18行、27行,可以看到調(diào)用了無(wú)參的抽象的 read() 方法。

總結(jié)如下: 在InputStream父類(lèi)中已經(jīng)定義好了讀取一個(gè)字節(jié)數(shù)組數(shù)據(jù)的方法是每次讀取一個(gè)字節(jié),并將其存儲(chǔ)到數(shù)組的第一個(gè)索引位置,讀取len個(gè)字節(jié)數(shù)據(jù)。具體如何讀取一個(gè)字節(jié)數(shù)據(jù)呢?由子類(lèi)實(shí)現(xiàn)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-647721.html

到了這里,關(guān)于Gof23設(shè)計(jì)模式之模板方法模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Gof23設(shè)計(jì)模式之狀態(tài)模式

    【例】通過(guò)按鈕來(lái)控制一個(gè)電梯的狀態(tài),一個(gè)電梯有開(kāi)門(mén)狀態(tài),關(guān)門(mén)狀態(tài),停止?fàn)顟B(tài),運(yùn)行狀態(tài)。每一種狀態(tài)改變,都有可能要根據(jù)其他狀態(tài)來(lái)更新處理。例如,如果電梯門(mén)現(xiàn)在處于運(yùn)行時(shí)狀態(tài),就不能進(jìn)行開(kāi)門(mén)操作,而如果電梯門(mén)是停止?fàn)顟B(tài),就可以執(zhí)行開(kāi)門(mén)操作。 問(wèn)題分

    2024年02月07日
    瀏覽(28)
  • Gof23設(shè)計(jì)模式之責(zé)任鏈模式

    責(zé)任鏈模式又名職責(zé)鏈模式,為了避免請(qǐng)求發(fā)送者與多個(gè)請(qǐng)求處理者耦合在一起,將所有請(qǐng)求的處理者通過(guò)前一對(duì)象記住其下一個(gè)對(duì)象的引用而連成一條鏈;當(dāng)有請(qǐng)求發(fā)生時(shí),可將請(qǐng)求沿著這條鏈傳遞,直到有對(duì)象處理它為止。 職責(zé)鏈模式主要包含以下角色: 抽象處理者(

    2024年02月09日
    瀏覽(25)
  • Gof23設(shè)計(jì)模式之橋接外觀模式

    又名門(mén)面模式,是一種通過(guò)為多個(gè)復(fù)雜的子系統(tǒng)提供一個(gè)一致的接口,而使這些子系統(tǒng)更加容易被訪問(wèn)的模式。該模式對(duì)外有一個(gè)統(tǒng)一接口,外部應(yīng)用程序不用關(guān)心內(nèi)部子系統(tǒng)的具體的細(xì)節(jié),這樣會(huì)大大降低應(yīng)用程序的復(fù)雜度,提高了程序的可維護(hù)性。 外觀(Facade)模式包含

    2024年02月15日
    瀏覽(22)
  • Gof23設(shè)計(jì)模式之建造者模式

    建造者模式(Builder Pattern)又叫生成器模式,是一種對(duì)象構(gòu)建模式。它可以將復(fù)雜對(duì)象的建造過(guò)程抽象出來(lái)(抽象類(lèi)別),使這個(gè)抽象過(guò)程的不同實(shí)現(xiàn)方法可以構(gòu)造出不同表現(xiàn)(屬性)的對(duì)象。 建造者模式是一步一步創(chuàng)建一個(gè)復(fù)雜的對(duì)象,它允許用戶(hù)只通過(guò)指定復(fù)雜對(duì)象的類(lèi)型和

    2024年02月11日
    瀏覽(33)
  • Gof23設(shè)計(jì)模式之單例模式(完整)

    單例模式(Singleton pattern)是Java中最簡(jiǎn)單的設(shè)計(jì)模式之一。這種設(shè)計(jì)模式屬于創(chuàng)建型模型,它提供了一種創(chuàng)建對(duì)象的最佳方式。 這種模式涉及到一個(gè)單一的類(lèi),該類(lèi)負(fù)責(zé)創(chuàng)建自己的對(duì)象,同時(shí)確保只有單個(gè)對(duì)象被創(chuàng)建。這個(gè)類(lèi)提供了一種訪問(wèn)其唯一的對(duì)象的方式,可以直接訪

    2024年02月10日
    瀏覽(26)
  • GOF 23 種設(shè)計(jì)模式應(yīng)用場(chǎng)景分析

    本文看下GOF 23 種設(shè)計(jì)模式應(yīng)用場(chǎng)景,詳細(xì)的還是通過(guò)文章給出參考鏈接學(xué)習(xí)下。 參考這篇文章 。 有幾種產(chǎn)品需要?jiǎng)?chuàng)建,比如創(chuàng)建紅蘋(píng)果,青蘋(píng)果,綠蘋(píng)果,這些對(duì)象通過(guò)一個(gè)對(duì)象就可以。 參考這篇文章 。 有幾種產(chǎn)品需要?jiǎng)?chuàng)建,但是每種產(chǎn)品不能簡(jiǎn)單的通過(guò)一個(gè)對(duì)象來(lái)表示

    2024年02月16日
    瀏覽(28)
  • Java設(shè)計(jì)模式 (一) 模板方法設(shè)計(jì)模式

    什么是模板方法設(shè)計(jì)模式? 模板方法設(shè)計(jì)模式是一種行為型設(shè)計(jì)模式,它定義了一個(gè)算法的骨架,并將一些步驟的具體實(shí)現(xiàn)延遲到子類(lèi)中。模板方法模式可以幫助確保在算法的不同部分中保持一致性,同時(shí)也允許子類(lèi)根據(jù)需要進(jìn)行具體實(shí)現(xiàn)。 模板方法模式的關(guān)鍵特點(diǎn)包括:

    2024年02月12日
    瀏覽(20)
  • java設(shè)計(jì)模式學(xué)習(xí)之【模板方法模式】

    java設(shè)計(jì)模式學(xué)習(xí)之【模板方法模式】

    設(shè)想你正在準(zhǔn)備一頓晚餐,無(wú)論你想做意大利面、披薩還是沙拉,制作過(guò)程中都有一些共同的步驟:準(zhǔn)備原料、加工食物、擺盤(pán)。這里,整個(gè)烹飪流程就像一個(gè)模板,而具體的菜肴則在這個(gè)模板的基礎(chǔ)上添加了特有的步驟。在軟件開(kāi)發(fā)中,我們經(jīng)常遇到類(lèi)似的情況,某些過(guò)程

    2024年02月03日
    瀏覽(30)
  • 創(chuàng)建型模式 (Creational Patterns) 玄子Share 設(shè)計(jì)模式 GOF 全23種 + 七大設(shè)計(jì)原則

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-NWLAOFtO-1691793071647)(./assets/%E7%8E%84%E5%AD%90Share%20%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%20GOF%20%E5%85%A823%E7%A7%8D%20+%20%E4%B8%83%E5%A4%A7%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99.png)] GoF(Gang of Four)是四位計(jì)算機(jī)科學(xué)家(Erich Gamma、Ri

    2024年02月12日
    瀏覽(27)
  • 【模板方法設(shè)計(jì)模式詳解】C/Java/JS/Go/Python/TS不同語(yǔ)言實(shí)現(xiàn)

    模板方法模式(Template Method Pattern)也叫模板模式,是一種行為型模式。它定義了一個(gè)抽象公開(kāi)類(lèi),包含基本的算法骨架,而將一些步驟延遲到子類(lèi)中,模板方法使得子類(lèi)可以不改變算法的結(jié)構(gòu),只是重定義該算法的某些特定步驟。不同的子類(lèi)以不同的方式實(shí)現(xiàn)這些抽象方法

    2024年02月01日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包