1. 程式人生 > >Head First設計模式之模板方法模式

Head First設計模式之模板方法模式

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設計模式之模板方法模式