22.模板模式
模板方法(Template Method)作為Java的設計模式之一,一個詞概括其優勢特點那就是:抽象步驟
首先我們應該抽出共通的東西做一個父類(Base類),其次具體的蛋糕制作由子類進一步實現,每一種制作方式我們就拓展一個子類
UML類圖:
仔細觀察Cake類,你會發現make方法是這個類的核心,make()中便是執行制作的核心代碼,為了盡可能將共通的東西都留在父類(base類),我們要進一步將make()中的代碼拆分,讓其變成眾多子步驟方法如下:
一、抽象類:蛋糕
public abstract class Cake {public final void make(){makeStart();//開始制作makeCakeGerm();//制作蛋糕胚makeCream();//怎么做wipeCakeGerm();//將奶油抹到蛋糕胚上piping();//怎么抹makeFinish();//結束制作}private void makeStart(){System.out.println("開始制作蛋糕");}private void makeCakeGerm(){System.out.println("制作蛋糕胚");}public abstract void makeCream();private void wipeCakeGerm(){System.out.println("將奶油抹到蛋糕胚上");}public abstract void piping();private void makeFinish(){System.out.println("結束制作蛋糕");}
}
我們可以看到已經把make方法中的步驟進一步拆分細化,有先做蛋糕胚,再做奶油,然后涂抹到蛋糕胚上,最后裱花
我們來注意幾個細節:
- 1、cake類成為了抽象類,沒啥好說的,方法都抽象了
- 2、make方法增加了final修飾,不希望子類覆寫這個方法,防止流程被更改
- 3、步驟抽象化,這是模板方法的核心,步驟的具體實現交由子類自行實現,每一種蛋糕都可以用不同的子類獨立實現,這樣可讀性就大大提高了,而且擴展也非常方便,只需要實現一個新的子類即可
接下來我們實現具體的蛋糕子類:
我們這里可以這樣想,蛋糕胚基本上沒什么差別,抹奶油也都是常規操作,不一樣的是制作什么樣的奶油以及裱花的樣式
蛋糕A:
public class Cake_A extends Cake {@Overridepublic void makeCream() {System.out.println("植物奶油 抹茶味");}@Overridepublic void piping() {System.out.println("裱花八朵");}
}
蛋糕B:
public class Cake_B extends Cake {@Overridepublic void makeCream() {System.out.println("動物奶油 巧克力味");}@Overridepublic void piping() {System.out.println("裱個生日快樂");}
}
測試類:
public class TemplateTest {public static void main(String[] args) {Cake cake_a = new Cake_A();Cake cake_b = new Cake_B();cake_a.make();System.out.println("*********************");cake_b.make();}
}
輸出結果:
開始制作蛋糕
制作蛋糕胚
植物奶油 抹茶味
將奶油抹到蛋糕胚上
裱花八朵
結束制作蛋糕開始制作蛋糕
制作蛋糕胚
動物奶油 巧克力味
將奶油抹到蛋糕胚上
裱個生日快樂
結束制作蛋糕