1. 程式人生 > >Java 設計模式--模板方法(Template Method)

Java 設計模式--模板方法(Template Method)

在星巴茲咖啡有著嚴格的咖啡沖泡法和茶沖泡法,分別如下:
星巴茲咖啡沖泡法:
1. 把水煮沸
2. 用沸水沖泡咖啡
3. 把咖啡倒進杯子
4. 加糖和牛奶

星巴茲茶沖泡法
1. 把水煮沸
2. 用沸水浸泡茶葉
3. 把茶倒進杯子
4. 加檸檬

讓我們用虛擬碼來實現上述的步驟
星巴茲咖啡沖泡法

public class Coffee {
    public void prepareRecipe() {
        boilWater();
        brewCoffeeGrinds();
        pourInCup();
        addSugarAndMilk();
    }

    private
void addSugarAndMilk() { System.err.println("addSugarAndMilk"); } private void pourInCup() { System.err.println("pourInCup"); } private void brewCoffeeGrinds() { System.err.println("brewCoffeeGrinds"); } private void boilWater() { System.err.println("boilWater"
); } }

星巴茲茶沖泡法

public class Tea {
    public void prepareRecipe() {
        boilWater();
        steepTeaBag();
        pourInCup();
        AddLemon();
    }

    private void AddLemon() {
        System.err.println("AddLemon");
    }

    private void pourInCup() {
        System.err.println("pourInCup"
); } private void steepTeaBag() { System.err.println("steepTeaBag"); } private void boilWater() { System.err.println("boilWater"); } }

在上述程式碼中,我們發現了一些重複程式碼,這表示我們要清理一下設計了。
1. prepareRecipe 在每個類中都不一樣,所以定義成抽象方法;
2. boilWater 和 pourInCup 方法被兩個子類所共享,所以被定義在超類中;
3. 無論是沖泡咖啡還是浸泡茶葉,差異都不大,都使用 brew 代替,
4. 加糖還是加檸檬都是加調料,差異都不大,都是用 addCondiments.
經上述的修改,我們需要定義一個超類,此類中有一個抽象方法 prepareRecipe 來處理茶和咖啡,同時因為茶和咖啡的沖泡方法不一樣,所以沖泡方法由各自的類實現,所以在超類中還有兩個抽象方法 brew 和 addCondiments。
咖啡因飲料的超類

public abstract class CoffeineBeverage {
    /**
     * 宣告為 final 是不希望子類覆蓋這個方法,而把方法內部的呼叫次序重寫
     */
    final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    private void boilWater() {
        System.err.println("boilWater");
    }

    protected abstract void brew();

    private void pourInCup() {
        System.err.println("pourInCup");
    }

    protected abstract void addCondiments();

}

再來看看咖啡和茶類

public class Coffee extends CoffeineBeverage{
    @Override
    protected void brew() {
        System.err.println("coffee brew");
    }

    @Override
    protected void addCondiments() {
        System.err.println("coffee addCondiments");
    }
}

public class Tea extends  CoffeineBeverage{
    @Override
    protected void brew() {
        System.err.println("Tea brew");
    }

    @Override
    protected void addCondiments() {
        System.err.println("Tea addCondiments");
    }
}

至此,程式碼的清理工作就結束了,讓我們來初步認識模板方法,
prepareRecipe 就是我們的模板方法,因為它本身就是一個方法;其次它作為一個方法的模板,在這個模板中,演算法內的每一個步驟都被一個方法代表,某些方法是由超類完成的,有些方法是由子類完成的,而由子類實現的方法被定義為抽象。所以超類專注於演算法本身,而由子類提供演算法實現。

模板方法模式定義
模板方法模式是類的行為模式。在一個方法中定義一個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結果的情況下,重新定義演算法中的某些步驟。
模板方法模式是所有模式中最為常見的幾個模式之一,是基於繼承的程式碼複用的基本技術。
模板方法模式需要開發抽象類和具體子類的設計師之間的協作。一個設計師負責給出一個演算法的輪廓和骨架,另一些設計師則負責給出這個演算法的各個邏輯步驟。代表這些具體邏輯步驟的方法稱做基本方法(primitive method);而將這些基本方法彙總起來的方法叫做模板方法(template method),這個設計模式的名字就是從此而來。
模板方法所代表的行為稱為頂級行為,其邏輯稱為頂級邏輯。模板方法模式的靜態結構圖如下所示:

  這裡寫圖片描述
這裡涉及到兩個角色:
1. 抽象模板(Abstract Template)角色有如下責任:
* 定義了一個或多個抽象操作,以便讓子類實現。這些抽象操作叫做基本操作,它們是一個頂級邏輯的組成步驟。
* 定義並實現了一個模板方法。這個模板方法一般是一個具體方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實現。頂級邏輯也有可能呼叫一些具體方法。
2. 具體模板(Concrete Template)角色又如下責任:
* 實現父類所定義的一個或多個抽象方法,它們是一個頂級邏輯的組成步驟。
* 每一個抽象模板角色都可以有任意多個具體模板角色與之對應,而每一個具體模板角色都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實現,從而使得頂級邏輯的實現各不相同。

模板方法模式中的方法
1. 模板方法
一個模板方法是定義在抽象類中的,把基本操作方法組合在一起形成一個總演算法或一個總行為的方法。一個抽象類可以有任意多個模板方法,而不限於一個。每一個模板方法都可以呼叫任意多個具體方法。
2. 基本方法
基本方法又可以分為三種:抽象方法(Abstract Method)、具體方法(Concrete Method)和鉤子方法(Hook Method)。
* 抽象方法:一個抽象方法由抽象類宣告,由具體子類實現。在Java語言裡抽象方法以abstract關鍵字標示。
* 具體方法:一個具體方法由抽象類宣告並實現,而子類並不實現或置換。
* 鉤子方法:一個鉤子方法由抽象類宣告並實現,而子類會加以擴充套件。通常抽象類給出的實現是一個空實現,作為方法的預設實現。
3. 預設鉤子方法
* 一個鉤子方法常常由抽象類給出一個空實現作為此方法的預設實現。這種空的鉤子方法叫做“Do Nothing Hook”。顯然,這種預設鉤子方法在預設適配模式裡面已經見過了,一個預設適配模式講的是一個類為一個介面提供一個預設的空實現,從而使得預設適配類的子類不必像實現介面那樣必須給出所有方法的實現,因為通常一個具體類並不需要所有的方法。
* 命名規則是設計師之間賴以溝通的管道之一,使用恰當的命名規則可以幫助不同設計師之間的溝通。鉤子方法的名字應當以do開始,這是熟悉設計模式的Java開發人員的標準做法。在上面的例子中,鉤子方法hookMethod()應當以do開頭;

相關推薦

Java設計模式 模板方法(Template Method)

Book物件程式碼如下: [java] view plaincopy public class Book { private String bookName; private int pages; private double

Java 設計模式--模板方法(Template Method)

在星巴茲咖啡有著嚴格的咖啡沖泡法和茶沖泡法,分別如下: 星巴茲咖啡沖泡法: 1. 把水煮沸 2. 用沸水沖泡咖啡 3. 把咖啡倒進杯子 4. 加糖和牛奶 星巴茲茶沖泡法 1. 把水煮沸 2. 用沸水浸泡茶葉 3. 把茶倒進杯子 4. 加檸檬

Java設計模式模板方法(Template Method)

模板是指在薄片塑料板上面寫字後挖空,再使用毛筆或色筆塗滿挖空部分,就能看到純手工而以不失工整的字樣,看到模板上的挖空形狀,馬上就知道最後會變出什麼樣子的字,不過實際上所顯現出來的字樣還是要依所使用的畫筆種類而定.拿黑色簽字筆當畫筆,結果當然就是簽字筆的字樣;當用鉛筆來畫,得到

設計模式-模板方法(Template Method)

概述 定義 : 定義了一個演算法的骨架, 並允許子類為一個或多個步驟提供實現 模板方法使得子類可以在不改變演算法結構的情況下, 重新定義演算法的某些步驟 型別 : 行為型 適用場景 一次性實現一個演算法的不變的部分, 並將可變的行為留給子類來

java設計模式----模板方法模式

抽象類 子類 底層 代碼 做事 方法 模板 期待 代碼復用 模板方法模式:   在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變算法結構的情況下,重新定義算法中的某些實現。 好萊塢原則:   別調用(打電話給)我們,我們會調用(打電話給

Java設計模式 - 模板方法模式

Java設計模式 - 模板方法模式 定義一個演算法的骨架,並將一些步驟通過子類表達。   UML圖示 要點 1. 定義一個演算法的骨架 - 建立一個抽象類 2. 將一些步驟通過子類表達 - 子類繼承抽象類 賦予不同實現   模板方法應用例項 模板方法

java設計模式--模板方法模式

1 簡介     定義一個模板結構,將具體內容延遲到子類去實現。它主要作用:在不改變模板結構的前提下在子類中重新定義模板中的內容。 主要兩點      1   提高程式碼複用性  &n

java設計模式--模板方法

1.模板方法定義 模板方法模式在一個方法中定義一個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。 2.模板方法的類圖 如圖,一個簡單的汽車例項。例項的程式碼如下: 定義一個汽車抽象模型的類。

Java設計模式模板方法模式

模板方法模式僅僅使用了Java的繼承機制,但它是一個應用非常廣泛的模式。1、定義:一個操作中的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。

Java設計模式-模板方法模式

定義 Define the skeleton of an algorithm in an operation,defer

Java設計模式透析之 —— 模板方法(Template Method)

style 格式 XML nis 實現 rgs format) font 原因 轉載請註明出處:http://blog.csdn.net/guolin_blog/article/details/8744002 今天你還是像往常一樣來上班,一如既往地開始了你的編程工作。

Java設計模式模板方法(Template Method)

模式定義 需求背景 具體實現 模式定義 模板方法: 定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個演算法的結構

Java設計模式之從[歡迎介面]分析模板方法(Template Method)模式

  模板方法是在抽象類中最常用的模式了(應該沒有之一),它定義一個操作中演算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變一個演算法的結構即可重新定義演算法的某些步驟。   例如我們要編寫一個歡迎介面,如果使用者是第一次開啟本軟體,則彈出一個歡迎的提示。為了能夠實現

Java設計模式之 —— 模板方法(Template Method)

今天你還是像往常一樣來上班,一如既往地開始了你的程式設計工作。 專案經理告訴你,今天想在伺服器端增加一個新功能,希望寫一個方法,能對Book物件進行處理,將Book物件的所有欄位以XML格式進行包裝,這樣以後可以方便與客戶端進行互動。並且在包裝開始前和結束後要列

設計模式模板方法(Template Method)

老板 就是 iam pre 一起 完成 nbsp str 記錄學習   在整理模板方法之前,先來說點廢話吧。除了記錄學習總結,也來記錄一下生活吧。   我們公司的老板在北京,老板也會因為項目來公司,不過不是天天來。公司有個同事,只要老板不在就天天遲到,而且一天比一天晚,經常

設計模式19:Template Method Pattern (模板方法模式)

Define:Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine c

設計模式——模板方法模式Template Method

一個抽象類中,有一個主方法,再定義1...n個方法,可以是抽象的,也可以是實際的方法,定義一個類,繼承該抽象類,重寫抽象方法,通過呼叫抽象類,實現對子類的呼叫 就是在AbstractCalculator類中定義一個主方法

設計模式模板方法Template Method

在基類中定義一套演算法框架,子類只能更改特定的實現細節。 程式碼示例: class AbstractClass { public: void templateMethod() { func

C++設計模式——模板方法Template Method

模板方法(template method)設計模式用於定義一個包含許多步驟的演算法框架,允許子類重寫(覆蓋)演算法的某一個步驟而不改變演算法整體的流程和框架。 模板方法提供的流程是骨架,子類無須覆蓋模板方法本身,只需繼承即可,即模板方法無須是 virtu

設計模式——模板方法模式Template Method Pattern】

 我先設計個類圖: 非常簡單的實現,你要悍馬模型,我就給你悍馬模型,先寫個抽象類,然後兩個不同型號的模型實現類,那我們把這個程式實現出來: HummerModel抽象類的程式清單如下: package template.method.pattern; /** * 是