溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

行為型模式:模板方法

發(fā)布時(shí)間:2020-06-20 02:24:25 來源:網(wǎng)絡(luò) 閱讀:161 作者:LieBrother 欄目:軟件技術(shù)

文章首發(fā):

行為型模式:模板方法

行為型模式:模板方法

十一大行為型模式之一:模板方法。

簡(jiǎn)介

姓名 :模板方法

英文名 :Template Method Pattern

價(jià)值觀 :在我的掌控下,任由你發(fā)揮

個(gè)人介紹

Define the skeleton of an algorithm in an operation,deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
定義一個(gè)操作中的算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
(來自《設(shè)計(jì)模式之禪》)

解釋一下上面的介紹,意思是由父類來定義框架,讓子類來具體實(shí)現(xiàn)。

你要的故事

剛過完春節(jié),大家都買新鞋了么?今天要講的故事和鞋子有關(guān)。一雙鞋子從表面來看,由鞋底、鞋墊、鞋面、鞋帶組成,同一系列的鞋子這幾個(gè)部分都是一樣的,用同樣的材料做出來,不同系列的鞋子就大相徑庭了。根據(jù)模板方法模式,組裝一雙鞋子的制造過程可以歸并為固定的框架,至于用什么材料,那由每個(gè)系列的鞋子去具體實(shí)現(xiàn)。我們先看定義組裝鞋子的框架代碼。

/**
 * 定義鞋子制造的工序框架
 */
abstract class ShoeInstallTemplate {

    public abstract void installSole();
    public abstract void installInsole();
    public abstract void installVamp();
    public abstract void installShoelace();

    public void installShot(){
        System.out.println("組裝一雙鞋,步驟如下:");
        // 組裝鞋底
        installSole();
        // 組裝鞋墊
        installInsole();
        // 組裝鞋面
        installVamp();
        // 組裝鞋帶
        installShoelace();
    }

}

定義了一個(gè)組裝鞋子框架的抽象類 ShoeInstallTemplate,里面有 4 個(gè)工序未具體實(shí)現(xiàn),由鞋子制造商去實(shí)現(xiàn),因?yàn)橹挥行又圃焐滩胖佬右檬裁床牧蟻碜觥?br/>下面舉 2 個(gè)比較出名的鞋子:Adidas 的 Boost 系列和 Nike 的 Jordan 系列。下面分別實(shí)現(xiàn)這 2 個(gè)系列鞋子的制造代碼。

/**
 * Adidas Boost 鞋制造
 */
class AdidasBoostShoeInstall extends ShoeInstallTemplate {
    @Override
    public void installSole() {
        System.out.println("組裝白色 Boost 鞋底");
    }

    @Override
    public void installInsole() {
        System.out.println("組裝黑色 Boost 鞋墊");
    }

    @Override
    public void installVamp() {
        System.out.println("組裝黑色 Boost 鞋面");
    }

    @Override
    public void installShoelace() {
        System.out.println("組裝黑色 Boost 鞋帶");
    }
}

/**
 * Nike Jordan 鞋制造
 */
class NikeJordanShoeInstall extends ShoeInstallTemplate {

    @Override
    public void installSole() {
        System.out.println("組裝黑色 Jordan 鞋底");
    }

    @Override
    public void installInsole() {
        System.out.println("組裝黑色 Jordan 鞋墊");
    }

    @Override
    public void installVamp() {
        System.out.println("組裝紅色 Jordan 鞋面");
    }

    @Override
    public void installShoelace() {
        System.out.println("組裝紅色 Jordan 鞋帶");
    }
}

實(shí)現(xiàn)了制造商制造鞋子的代碼之后,我們通過代碼測(cè)試怎么制造 Boost 和 Jordan 鞋子。

public class TemplateMethodTest {

    public static void main(String[] args) {
        ShoeInstallTemplate adidasBoost = new AdidasBoostShoeInstall();
        adidasBoost.installShot();

        ShoeInstallTemplate nikeJordan = new NikeJordanShoeInstall();
        nikeJordan.installShot();
    }

}

打印結(jié)果:
組裝一雙鞋,步驟如下:
組裝白色 Boost 鞋底
組裝黑色 Boost 鞋墊
組裝黑色 Boost 鞋面
組裝黑色 Boost 鞋帶

組裝一雙鞋,步驟如下:
組裝黑色 Jordan 鞋底
組裝黑色 Jordan 鞋墊
組裝紅色 Jordan 鞋面
組裝紅色 Jordan 鞋帶

模板方法模式就這么簡(jiǎn)單。是不是掌握了?

代碼:
Template Method Pattern

總結(jié)

模板方法是一個(gè)比較實(shí)用的模式,為什么說實(shí)用呢?舉個(gè)現(xiàn)實(shí)的例子,Java 能有如今的發(fā)展,離不開各大開源框架,比如 Dubbo,有看過源碼的朋友就知道,里面大量代碼運(yùn)用了模板方法設(shè)計(jì)模式,為什么 Dubbo 可以支持很多種注冊(cè)中心?其實(shí)本質(zhì)就是用了模板方法設(shè)計(jì)模式,使得可以擴(kuò)展多種注冊(cè)中心。掌握好模板方法,對(duì)讀源碼有非常大的幫助,很多人包括我在內(nèi),在剛開始閱讀源碼的時(shí)候,有相當(dāng)長(zhǎng)的一段時(shí)間懷疑人生,怎么這些代碼那么繞?調(diào)來調(diào)去的。當(dāng)你了解了常用的設(shè)計(jì)模式之后,看源代碼就可以直截了當(dāng)?shù)闹朗怯檬裁丛O(shè)計(jì)模式,為什么用這個(gè)設(shè)計(jì)模式?原來是為了什么什么。。。有了這層思考,就像有一條線將以前散落在各地的知識(shí)點(diǎn)連接起來,成了可以推敲的知識(shí)

推薦閱讀
單一職責(zé)原則(方法:修改名字還是密碼?接口:洗碗、買菜還是倒垃圾?類:注冊(cè)、登錄和注銷)
里氏替換原則(我兒來自新東方烹飪)
依賴倒置原則(摳門的飯店老板)
接口隔離原則(小伙子的作坊)
迪米特法則(手機(jī)上看電子書)
開閉原則(社保這點(diǎn)事)
創(chuàng)建型模式:?jiǎn)卫J剑ㄐ∶骶椭挥?1 輛車)
創(chuàng)建型模式:工廠方法(小明家的車庫)
創(chuàng)建型模式:抽象工廠(寶馬車就得用寶馬輪胎和寶馬方向盤)
創(chuàng)建型模式:建造者模式(湯這么煲)
創(chuàng)建型模式:原型模式(復(fù)印書籍)

公眾號(hào)后臺(tái)回復(fù)『大禮包』獲取 Java、Python、IOS 等教程
加個(gè)人微信備注『教程』獲取架構(gòu)師、機(jī)器學(xué)習(xí)等教程

行為型模式:模板方法

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI