行爲型模式:模板方法

LieBrother公衆號原文:
行爲型模式:模板方法java

景

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

簡介

姓名 :模板方法github

英文名 :Template Method Pattern算法

價值觀 :在個人掌控下,任由你發揮設計模式

我的介紹框架

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.
定義一個操做中的算法的框架,而將一些步驟延遲到子類中。使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。
(來自《設計模式之禪》)ide

解釋一下上面的介紹,意思是由父類來定義框架,讓子類來具體實現。測試

你要的故事

剛過完春節,你們都買新鞋了麼?今天要講的故事和鞋子有關。一雙鞋子從表面來看,由鞋底、鞋墊、鞋面、鞋帶組成,同一系列的鞋子這幾個部分都是同樣的,用一樣的材料作出來,不一樣系列的鞋子就截然不同了。根據模板方法模式,組裝一雙鞋子的製造過程能夠歸併爲固定的框架,至於用什麼材料,那由每一個系列的鞋子去具體實現。咱們先看定義組裝鞋子的框架代碼。設計

/**
 * 定義鞋子製造的工序框架
 */
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();
    }

}

定義了一個組裝鞋子框架的抽象類 ShoeInstallTemplate,裏面有 4 個工序未具體實現,由鞋子製造商去實現,由於只有鞋子製造商才知道鞋子要用什麼材料來作。
下面舉 2 個比較出名的鞋子:Adidas 的 Boost 系列和 Nike 的 Jordan 系列。下面分別實現這 2 個系列鞋子的製造代碼。code

/**
 * 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 鞋帶");
    }
}

實現了製造商製造鞋子的代碼以後,咱們經過代碼測試怎麼製造 Boost 和 Jordan 鞋子。

public class TemplateMethodTest {

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

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

}

打印結果:
組裝一雙鞋,步驟以下:
組裝白色 Boost 鞋底
組裝黑色 Boost 鞋墊
組裝黑色 Boost 鞋面
組裝黑色 Boost 鞋帶

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

模板方法模式就這麼簡單。是否是掌握了?

代碼:
Template Method Pattern

總結

模板方法是一個比較實用的模式,爲何說實用呢?舉個現實的例子,Java 能有現在的發展,離不開各大開源框架,好比 Dubbo,有看過源碼的朋友就知道,裏面大量代碼運用了模板方法設計模式,爲何 Dubbo 能夠支持不少種註冊中心?其實本質就是用了模板方法設計模式,使得能夠擴展多種註冊中心。掌握好模板方法,對讀源碼有很是大的幫助,不少人包括我在內,在剛開始閱讀源碼的時候,有至關長的一段時間懷疑人生,怎麼這些代碼那麼繞?調來調去的。當你瞭解了經常使用的設計模式以後,看源代碼就能夠直截了當的知道是用什麼設計模式,爲何用這個設計模式?原來是爲了什麼什麼。。。有了這層思考,就像有一條線將之前散落在各地的知識點鏈接起來,成了能夠推敲的知識

參考資料:《大話設計模式》、《設計模式之禪》

推薦閱讀:

設計模式系列文章

相關文章
相關標籤/搜索