国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

一文搞懂設(shè)計(jì)模式—模板方法模式

開(kāi)發(fā) 前端
模板方法是一種簡(jiǎn)單但非常實(shí)用的設(shè)計(jì)模式,它通過(guò)定義一個(gè)算法的框架,并將具體實(shí)現(xiàn)延遲到子類中,實(shí)現(xiàn)了代碼復(fù)用和擴(kuò)展的目的。在具體實(shí)現(xiàn)步驟相對(duì)固定、但又存在差異性的情況下,模板方法模式能夠很好地解決代碼重復(fù)和維護(hù)難度的問(wèn)題。

模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),是一種行為設(shè)計(jì)模式,它定義了一個(gè)操作中的算法框架,將某些步驟的具體實(shí)現(xiàn)留給子類。通過(guò)模板方法模式,我們可以在不改變算法結(jié)構(gòu)的情況下,允許子類重新定義某些步驟,從而實(shí)現(xiàn)代碼復(fù)用和擴(kuò)展。

在軟件開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到需要定義一組相似操作的場(chǎng)景。這些操作可能在整體上有著相同的結(jié)構(gòu),但在細(xì)節(jié)上有所差異。如果每次都重復(fù)編寫(xiě)這些操作的通用結(jié)構(gòu),會(huì)導(dǎo)致代碼的冗余性,同時(shí)也增加了后期維護(hù)的難度。為了解決這個(gè)問(wèn)題,模板方法模式應(yīng)運(yùn)而生。

使用場(chǎng)景

模板方法模式適用于以下場(chǎng)景:

  • 當(dāng)存在一組相似的操作,它們具有相同的算法結(jié)構(gòu),但實(shí)現(xiàn)細(xì)節(jié)各不相同時(shí)。
  • 當(dāng)希望在不改變算法的整體結(jié)構(gòu)的情況下,允許子類自由擴(kuò)展或修改某些步驟時(shí)。
  • 當(dāng)希望將算法的實(shí)現(xiàn)細(xì)節(jié)封裝起來(lái),只暴露出高層接口供調(diào)用者使用時(shí)。

JUC 下的 AQS 就使用到了模板方法模式,其中 acquire() 是模板方法。tryAcquire() 方法的具體實(shí)現(xiàn)去交給子類完成。

/**
     * Acquires in exclusive mode, ignoring interrupts.  Implemented
     * by invoking at least once {@link #tryAcquire},
     * returning on success.  Otherwise the thread is queued, possibly
     * repeatedly blocking and unblocking, invoking {@link
     * #tryAcquire} until success.  This method can be used
     * to implement method {@link Lock#lock}.
     *
     * @param arg the acquire argument.  This value is conveyed to
     *        {@link #tryAcquire} but is otherwise uninterpreted and
     *        can represent anything you like.
     */
    public final void acquire(int arg) {
        if (!tryAcquire(arg) &&
            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
            selfInterrupt();
    }

    protected boolean tryAcquire(int arg) {
        throw new UnsupportedOperationException();
    }

實(shí)現(xiàn)方式

結(jié)構(gòu)說(shuō)明

模板方法模式由抽象類和具體子類組成。抽象類定義了算法的框架,其中包含了一個(gè)或多個(gè)抽象方法,用于由具體子類實(shí)現(xiàn)。具體子類繼承抽象類,并根據(jù)需要重寫(xiě)其中的抽象方法,從而實(shí)現(xiàn)具體的細(xì)節(jié)。

在模板方法模式中,通常涉及以下幾個(gè)角色:

  • 抽象類(Abstract Class):抽象類定義了算法的框架,包括一個(gè)或多個(gè)抽象方法和具體方法。其中的抽象方法由子類實(shí)現(xiàn),具體方法可以被子類直接繼承或重寫(xiě)。
  • 具體子類(Concrete Subclass):具體子類繼承抽象類,并根據(jù)需要實(shí)現(xiàn)其中的抽象方法。具體子類提供了算法的具體實(shí)現(xiàn)細(xì)節(jié)。

示例代碼

以下是一個(gè)簡(jiǎn)單的代碼示例:

// 抽象類,定義模板方法和抽象步驟方法
public abstract class AbstractClass {
    // 模板方法,定義算法的整體結(jié)構(gòu)
    public final void templateMethod() {
        step1();
        step2();
        step3();
    }
     // 模板公共方法
    protected final void step1(){
      System.out.println("ConcreteClass: Step 1");
    }
    // 抽象步驟方法,由子類實(shí)現(xiàn)具體的步驟邏輯
    protected abstract void step2();
    // 抽象步驟方法,由子類實(shí)現(xiàn)具體的步驟邏輯
    protected abstract void step3();
}

// 具體子類,實(shí)現(xiàn)抽象步驟方法
public class ConcreteClass extends AbstractClass {
    
    protected void step2() {
        System.out.println("ConcreteClass: Step 2");
    }

    protected void step3() {
        System.out.println("ConcreteClass: Step 3");
    }
}

// 客戶端代碼
public class Client {
    public static void main(String[] args) {
        AbstractClass abstractClass = new ConcreteClass();
        abstractClass.templateMethod();
    }
}

在上述代碼中,我們首先定義了一個(gè)抽象類 AbstractClass,其中包含了模板方法和抽象方法。然后,我們創(chuàng)建了具體子類 ConcreteClass,根據(jù)需要實(shí)現(xiàn)了抽象方法。

在客戶端代碼 Client 中,我們創(chuàng)建了具體子類的對(duì)象,并調(diào)用了模板方法 templateMethod(),從而執(zhí)行了定義好的算法。

運(yùn)行該代碼將輸出以下結(jié)果:

ConcreteClass: Step 1
ConcreteClass: Step 2
ConcreteClass: Step 3

注意:

  • 一般模板方法都加上 final 關(guān)鍵字, 防止子類重寫(xiě)模板方法。
  • 抽象模板中的基本方法盡量設(shè)計(jì)為 protected 類型,符合迪米特法則,不需要暴露的屬性或方法盡量不要設(shè)置為 protected 類型。實(shí)現(xiàn)類若非必要,盡量不要擴(kuò)大父類中的訪問(wèn)權(quán)限。

鉤子方法

鉤子方法(Hook Method)是模板方法模式中的一種特殊方法,用于在抽象類中提供一個(gè)默認(rèn)的實(shí)現(xiàn),但允許具體子類選擇性地進(jìn)行重寫(xiě)或擴(kuò)展。鉤子方法允許子類在不改變算法骨架的情況下,對(duì)算法的某些步驟進(jìn)行定制。

以下是一個(gè)包含鉤子方法的 Java 示例代碼:

// 抽象類,定義模板方法和鉤子方法
public abstract class AbstractClass {
    // 模板方法,定義算法的整體結(jié)構(gòu)
    public final void templateMethod() {
        step1();
        step2();
    // 鉤子方法的調(diào)用
        if (hookMethod()) {  
            step3();
        }
    }

    protected abstract void step1();

    protected abstract void step2();

    // 鉤子方法,默認(rèn)返回true,子類可以選擇性地重寫(xiě)
    protected boolean hookMethod() {
        return true;
    }

    protected abstract void step3();
}

// 具體子類1
public class ConcreteClass1 extends AbstractClass {
    protected void step1() {
        System.out.println("ConcreteClass1: Step 1");
    }

    protected void step2() {
        System.out.println("ConcreteClass1: Step 2");
    }

    protected void step3() {
        System.out.println("ConcreteClass1: Step 3");
    }
}

// 具體子類2
public class ConcreteClass2 extends AbstractClass {
    protected void step1() {
        System.out.println("ConcreteClass2: Step 1");
    }

    protected void step2() {
        System.out.println("ConcreteClass2: Step 2");
    }

    protected boolean hookMethod() {
        return false; // 重寫(xiě)鉤子方法,返回false
    }

    protected void step3() {
        System.out.println("ConcreteClass2: Step 3");
    }
}

// 客戶端代碼
public class Client {
    public static void main(String[] args) {
        AbstractClass class1 = new ConcreteClass1();
        class1.templateMethod();

        System.out.println("------------------");

        AbstractClass class2 = new ConcreteClass2();
        class2.templateMethod();
    }
}

在上述代碼中,我們定義了一個(gè)抽象類 AbstractClass,其中包含模板方法 templateMethod() 和鉤子方法 hookMethod()。在模板方法中,我們先執(zhí)行了step1() 和 step2() 兩個(gè)基本操作方法,然后通過(guò)調(diào)用鉤子方法決定是否執(zhí)行 step3()。

具體子類 ConcreteClass1 和 ConcreteClass2 繼承了抽象類,并實(shí)現(xiàn)了基本操作方法 step1()、step2() 和鉤子方法 hookMethod()、step3()。

在客戶端代碼 Client 中,我們分別創(chuàng)建了具體子類的對(duì)象,并調(diào)用其模板方法,從而執(zhí)行了定義好的算法。

運(yùn)行該示例代碼將輸出以下結(jié)果:

ConcreteClass1: Step 1
ConcreteClass1: Step 2
ConcreteClass1: Step 3
------------------
ConcreteClass2: Step 1
ConcreteClass2: Step 2

通過(guò)重寫(xiě)鉤子方法,具體子類可以選擇性地對(duì)算法進(jìn)行定制化。這就展示了鉤子方法在模板方法模式中的應(yīng)用。

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

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

  • 代碼復(fù)用:模板方法模式通過(guò)將算法的通用結(jié)構(gòu)定義在抽象類中,可以使子類直接繼承這些通用部分,從而達(dá)到代碼復(fù)用的目的。
  • 擴(kuò)展性:模板方法模式允許子類根據(jù)需要重寫(xiě)父類的某些步驟,從而實(shí)現(xiàn)對(duì)算法的自由擴(kuò)展和修改,同時(shí)保持整體結(jié)構(gòu)的穩(wěn)定性。
  • 封裝性:模板方法模式將算法的實(shí)現(xiàn)細(xì)節(jié)封裝在抽象類中,對(duì)調(diào)用者屏蔽了具體的實(shí)現(xiàn)細(xì)節(jié),只暴露出高層接口。

缺點(diǎn)

  • 模板方法模式將算法的執(zhí)行流程固定在抽象類中,可能會(huì)導(dǎo)致代碼的可讀性降低,增加理解和維護(hù)的難度。
  • 模板方法中的步驟越多, 其維護(hù)工作就可能會(huì)越困難。
  • 通過(guò)子類抑制默認(rèn)步驟實(shí)現(xiàn)可能會(huì)導(dǎo)致違反里氏替換原則。

總結(jié)

模板方法是一種簡(jiǎn)單但非常實(shí)用的設(shè)計(jì)模式,它通過(guò)定義一個(gè)算法的框架,并將具體實(shí)現(xiàn)延遲到子類中,實(shí)現(xiàn)了代碼復(fù)用和擴(kuò)展的目的。在具體實(shí)現(xiàn)步驟相對(duì)固定、但又存在差異性的情況下,模板方法模式能夠很好地解決代碼重復(fù)和維護(hù)難度的問(wèn)題。

責(zé)任編輯:武曉燕 來(lái)源: Java隨想錄
相關(guān)推薦

2024-02-20 12:09:32

模式工廠方法接口

2024-02-26 11:52:38

代理模式設(shè)計(jì)

2024-01-29 12:22:07

設(shè)計(jì)模式策略模式

2024-02-19 13:11:38

門(mén)面模式系統(tǒng)

2023-05-22 13:27:17

2024-01-30 13:15:00

設(shè)計(jì)模式責(zé)任鏈

2024-02-23 12:11:53

裝飾器模式對(duì)象

2024-02-27 11:59:12

享元模式對(duì)象

2024-02-04 12:04:17

2024-02-18 12:36:09

2024-02-22 12:13:49

適配器模式代碼

2022-05-05 16:47:24

Docker網(wǎng)絡(luò)空間容器

2023-12-12 11:09:55

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

2022-09-21 16:56:16

設(shè)計(jì)模式微服務(wù)架構(gòu)

2012-07-11 08:51:51

設(shè)計(jì)模式

2013-11-26 17:15:13

Android設(shè)計(jì)模式

2022-03-24 08:51:48

Redis互聯(lián)網(wǎng)NoSQL

2020-11-17 09:32:57

設(shè)計(jì)模式責(zé)任鏈

2024-04-12 12:19:08

語(yǔ)言模型AI

2020-11-10 09:20:40

開(kāi)發(fā)模式代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本大胆欧美| 国产.欧美.日韩| 午夜日韩电影| 久久精品亚洲乱码伦伦中文| 欧美精品一区二区三区蜜桃| 国产高清视频网站| 亚洲免费在线视频| 日本天堂在线观看| 亚洲精品自在久久| 国产欧美日韩精品一区二区三区| 欧美一区1区三区3区公司 | 成人黄色电影在线| 777xxx欧美| 国产一区二区三区免费观看在线| 蜜桃成人在线| 一区二区视频免费在线观看| 四虎4545www国产精品| 97色在线观看| 2欧美一区二区三区在线观看视频| 欧美人与牲禽动交com| 国产97在线亚洲| 久久青草国产手机看片福利盒子| 99久久精品免费观看国产| 亚洲综合色激情五月| 日韩毛片精品高清免费| 日韩国产成人无码av毛片| 成人福利视频网| 亚洲 中文字幕 日韩 无码| 希岛爱理av一区二区三区| 最近2019中文字幕大全第二页| 中文字幕一二三区在线观看| 一本色道久久综合亚洲精品不卡| 99re视频在线播放| 欧美视频一区| 久久精品第九区免费观看| 在线视频亚洲专区| 国产精品免费视频网站| 久久久亚洲精品无码| 热久久一区二区| 国产经品一区二区| 99精品热6080yy久久| 色偷偷免费视频| 欧美亚洲日本一区| 欧美少妇另类| 精品欧美aⅴ在线网站| 成人国产精选| 91欧美激情另类亚洲| 成人黄色在线看| 日韩精品在线中文字幕| 欧美电影免费| 欧美久久久久久| 午夜视频一区二区三区| 小小水蜜桃在线观看| 亚洲综合丝袜美腿| 日韩精品第二页| 日本成人免费| 国产性色av一区二区| 日本福利一区| 欧美日韩一区在线观看视频| 中文字幕在线观看不卡| 中文字幕日本一区| 久久天天躁狠狠躁夜夜爽蜜月| 2024最新电影免费在线观看| 日韩欧美电影在线| 亚洲女同av| 在线观看中文字幕亚洲| 国产精品一区二区三区av| 97在线看免费观看视频在线观看| 国产一区三区在线播放| 粉嫩精品一区二区三区在线观看 | 裸体裸乳免费看| 精品一区二区三区在线观看| 精品国产av无码一区二区三区| 日本一区二区在线不卡| 在线播放你懂得| 日韩亚洲欧美成人一区| 欧美亚洲福利| 国产精品久久久久久久久久尿| 亚洲激情婷婷| 国产精品国产对白熟妇| 亚洲一线二线三线久久久| gogo在线观看| 久久精品欧美视频| 国产精品久久久久一区二区三区厕所 | 精品久久久久久久久久久久| 在线观看a视频| 亚洲视频视频在线| 国产成人1区| 神马影院午夜我不卡影院| 国产亚洲综合性久久久影院| 成年人在线免费观看| 日韩视频免费在线| 一区二区免费不卡在线| 国产精品无码免费专区午夜| 亚洲国产欧美日韩另类综合 | 国产66精品| 国产高清在线精品一区二区三区| 国产一区在线视频| 豆国产96在线|亚洲| 蜜桃视频在线观看www社区| 国产精品视频永久免费播放| 久久99国产精品久久| 久久精品黄色| 欧美在线观看网站| 久久免费黄色| 成人永久免费网站| 精品国产一区二区三区久久久蜜月 | 国产精品四虎| 最近2019年好看中文字幕视频 | 亚洲欧美成人网| 日韩在线不卡| 综合一区中文字幕| 亚洲高清久久久| 欧美va在线观看| 亚洲影院在线看| 国产日产欧美一区二区视频| 在线你懂的视频| 国产精品视频免费在线| 国产精品中文字幕一区二区三区| 中文在线а√天堂官网| 久久精品夜夜夜夜夜久久| 国产精品日韩| 免费看成一片| 精品少妇一区二区30p| 亚洲欧美网站| 日韩大片b站免费观看直播| 久久影视电视剧免费网站| 丝袜亚洲另类欧美| 欧洲天堂在线观看| 国产精品扒开腿爽爽爽视频| 91麻豆免费视频| 亚洲人成午夜免电影费观看| 久久本道综合色狠狠五月| 亚洲一线二线三线视频| 四色成人av永久网址| 国产一区二区色| 激情欧美一区| 国产91亚洲精品| 国内精品一区二区三区| 亚洲欧美另类综合偷拍| 亚洲高清不卡一区| 午夜视频久久久久久| 深夜激情久久| 99热这里只有精品7| 日韩视频在线观看一区二区| 一二三区不卡| 尤物视频免费在线观看| 欧美亚洲国产成人精品| 久久这里只有精品6| 免费观看一级欧美片| 日韩高清三级| 欧美精品第1页| 国产精品s色| 视频一区二区三区国产| 国产精品福利网站| 亚洲人吸女人奶水| 日韩伦理一区二区三区| 99免费视频| 性欧美亚洲xxxx乳在线观看| 国产视频视频一区| 亚洲精品一二三**| 国产又大又黄又猛| 久久久久亚洲精品成人网小说| 国产网站一区二区| 久久丝袜视频| 玖玖在线免费视频| 91在线网站视频| 欧美视频在线播放| 久久精品一本| 日本不良网站在线观看| 黄色激情在线视频| 久久视频在线直播| 国产视频不卡一区| 精品一区三区| 欧美精品少妇| 日韩一区二区三区高清| 日韩电影免费在线观看中文字幕| 国产一区二区福利| 免费一级欧美在线大片| 男裸体无遮挡网站| 亚洲wwwav| 亚洲国产91精品在线观看| 国产精品一区免费视频| 国产中文欧美日韩在线| 成人网址大全| 91亚洲精品一区| 欧美精品一区二区三区视频| 91亚洲国产成人精品一区二区三| 日韩有码一区| 丁香在线视频| a天堂资源在线观看| 2023亚洲男人天堂| 欧美日韩综合在线免费观看| 久久国产精品99精品国产| 榴莲视频成人app| 视频一区二区三区国产| 日韩精品一区二区三区电影| 欧美自拍视频在线观看| 在线综合+亚洲+欧美中文字幕| 成人精品一区二区三区中文字幕 |