模板方法模式是一種只需使用繼承就能夠實現的很是簡單的模式。模板方法模式由兩部分結構組成,第一部分是抽象父類,第二部分是具體的實現子類。一般在抽象父類中封裝了子類的算法框架,也包括實現一些公共方法以及封裝子類中全部方法的執行順序。子類經過繼承這個抽象類,也繼承了整個算法結構,而且能夠選擇重寫父類的方法。算法
模板方法模式包含如下角色:typescript
定義 AbstractClass 抽象類segmentfault
class AbstractClass { public method1(): void { throw new Error("Abstract Method"); } public method2(): void { throw new Error("Abstract Method"); } public method3(): void { throw new Error("Abstract Method"); } public templateMethod(): void { console.log("templateMethod is being called"); this.method1(); this.method2(); this.method3(); } }
定義 ConcreteClass 類設計模式
class ConcreteClass extends AbstractClass { public method1(): void { console.log("method1 of ConcreteClass"); } public method2(): void { console.log("method2 of ConcreteClass"); } public method3(): void { console.log("method3 of ConcreteClass"); } }
function show(): void { const cc: ConcreteClass = new ConcreteClass(); cc.templateMethod(); }
以上代碼成功運行後會輸出如下結果:框架
templateMethod is being called method1 of ConcreteClass method2 of ConcreteClass method3 of ConcreteClass
下面爲了讓小夥伴們能更好地理解模板方法設計模式,咱們來以 「泡咖啡與泡茶」 這個經典的例子來深刻介紹模板方法。this
首先,咱們先來泡一杯咖啡,泡咖啡的步驟一般以下:spa
接下來,開始準備咱們的茶,泡茶的步驟跟泡咖啡的步驟相似:設計
根據上面泡咖啡和泡茶的步驟,咱們能夠整理出如下表格:code
泡咖啡步驟 | 泡茶步驟 |
---|---|
把水煮沸 | 把水煮沸 |
用沸水沖泡咖啡 | 用沸水浸泡茶葉 |
把咖啡倒進杯子 | 把茶水倒進杯子 |
加糖和牛奶 | 加檸檬 |
咱們能夠發現泡咖啡和泡茶主要有如下不一樣點:對象
通過抽象以後,不論是泡咖啡仍是泡茶,咱們都能整理爲下面四步:
因此,不論是沖泡仍是浸泡,咱們都能給它一個新的方法名稱,好比說 brew()
。同理,不論是加糖和牛奶,仍是加檸檬,咱們均可以稱之爲 addCondiments()
。
如今咱們能夠建立一個抽象父類來表示泡一杯飲料的整個過程。不管是咖啡(Coffee),仍是茶(Tea),都被咱們用飲料(Beverage)來表示,最後咱們來看一下具體實現。
建立 Beverage 抽象類
abstract class Beverage { boilWater() { console.log("把水煮沸"); } abstract brew(): void; abstract pourInCup(): void; abstract addCondiments(): void; // 模板方法 makeBeverage() { this.boilWater(); this.brew(); this.pourInCup(); this.addCondiments(); } }
建立 Coffee 類
class Coffee extends Beverage { brew(): void { console.log("用沸水沖泡咖啡"); } pourInCup(): void { console.log("把咖啡倒進杯子"); } addCondiments(): void { console.log("加糖和牛奶"); } }
建立 Tea 類
class Tea extends Beverage { brew(): void { console.log("用沸水浸泡茶葉"); } pourInCup(): void { console.log("把茶倒進杯子"); } addCondiments(): void { console.log("加檸檬"); } }
使用示例
function show(): void { const coffee: Coffee = new Coffee(); const tea: Tea = new Tea(); coffee.makeBeverage(); tea.makeBeverage(); }
以上代碼成功運行後會輸出如下結果:
把水煮沸 用沸水沖泡咖啡 把咖啡倒進杯子 加糖和牛奶 把水煮沸 用沸水浸泡茶葉 把茶倒進杯子 加檸檬
在模板方法設計模式中,一個抽象類公開定義了執行它的方法的方式/模板。它的子類能夠按須要重寫方法實現,但調用將以抽象類中定義的方式進行。模板方法定義一個操做中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。
本人的全棧修仙之路訂閱號,會按期分享 Angular、TypeScript、Node.js/Java 、Spring 相關文章,歡迎感興趣的小夥伴訂閱哈!