Head First設計模式之模板方法模式
阿新 • • 發佈:2017-07-21
names 去除 缺點 ide 個數 write ima 父類 public
一、定義
在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變算法結構的情況下,重定義該算法中的某些特定步驟。
比較通俗的說法,子類決定如何實現算法中的某些步驟,比如兩個一連串的操作,操作次序是一樣的,有的操作相同,有的不同,將兩個連串操作抽象出父類;
子類在相同次序,但具體方法不一樣的操作 在父類抽象出來,然後在子類重寫實現,達到減少重復代碼。
二、結構
三、實現
以下以泡茶和泡咖啡為例子
namespace DesignPatterns.Template { /// <summary> /// 模版方法 /// </summary>class Program { static void Main(string[] args) { Tea tea = new Tea(); tea.PrepareRecipe(); Console.WriteLine("==== 我是分界線 ===="); Coffee coffee = new Coffee(); coffee.PrepareRecipe(); } }public class Tea : Beverage { public override void Brew() { Console.WriteLine("沖泡茶葉"); } public override void AddCondiments() { Console.WriteLine("加檸檬"); } } public class Coffee : Beverage {public override void Brew() { Console.WriteLine("沖泡咖啡"); } public override void AddCondiments() { Console.WriteLine("加糖和牛奶"); } } public abstract class Beverage { public void PrepareRecipe() { BoilWater(); Brew(); PourInCup(); AddCondiments(); } public abstract void Brew(); public abstract void AddCondiments(); public void BoilWater() { Console.WriteLine("泡開水"); } public void PourInCup() { Console.WriteLine("倒進杯子"); } } }
結果:
泡開水 沖泡茶葉 倒進杯子 加檸檬 ==== 我是分界線 ==== 泡開水 沖泡咖啡 倒進杯子 加糖和牛奶 請按任意鍵繼續. . .
四、適用場景
在多個子類擁有相同的方法,並且這些方法邏輯相同時,可以考慮使用模版方法模式。在程序的主框架相同,細節不同的場合下,也比較適合使用這種模式。
五、優缺點
優點:
模板方法模式通過把不變的行為搬移到超類,去除了子類中的重復代碼。
子類實現算法的某些細節,有助於算法的擴展。
通過一個父類調用子類實現的操作,通過子類擴展增加新的行為,符合“開放-封閉原則”。
缺點:
每個不同的實現都需要定義一個子類,導致類的個數增加,設計更加抽象;
子類的實現也可以影響父類中主邏輯的運行,在靈活的同時,由於子類影響到了父類,違反了裏氏替換原則,也會給程序帶來風險。這就對抽象類的設計有了更高的要求。
Head First設計模式之模板方法模式