設計模式(14) 模板方法模式

模板方法模式

模板方法模式是面向對象系統中非常樸實的一種模式,體現出面向對象設計中繼承和多態的基本特徵。在開發應用的過程中,往往會在初期規劃一些較粗粒度的算法,而且對參與計算的對象進行抽象,明確算法會使用到哪些方法,每個方法可以提供哪些支持,但此時每個方法本身並沒有細化;隨着開發過程的展開,我們可能會具體實現每個方法,或者對最初的一些方法進行替換,覆蓋上新的內容,這樣就在一個相對固定的算法框架下,通過子類(或其他方法)的變化,實現了算法的差異性。

GOF對模板方法模式的描述爲:
Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method let ssubclasses redefine certain steps of an algorithm without changing the algorithm's structure..
— Design Patterns : Elements of Reusable Object-Oriented Software

UML類圖:

代碼示例:

public abstract class Template
{
    public abstract void Init();
    public abstract void Start();
    public abstract void End();

    public void Process()
    {
        Init();
        Start();
        End();
    }
}

public class ConcreteProcessor1 : Template
{
    public override void End()
    {
        Console.WriteLine("Process1 End");
    }

    public override void Init()
    {
        Console.WriteLine("Process1 Init");
    }

    public override void Start()
    {
        Console.WriteLine("Process1 Start");
    }
}

public class ConcreteProcessor2 : Template
{
    public override void End()
    {
        Console.WriteLine("Process2 End");
    }

    public override void Init()
    {
        Console.WriteLine("Process2 Init");
    }

    public override void Start()
    {
        Console.WriteLine("Process2 Start");
    }        
}

適用場景

  • 在實現一個算法時,發現其中有些部分非常易變,或者很容易隨着運行環境、後續開發的不同產生而很多變化,此時就按照模板方法模式可以把它們抽象出來,供子類完成。
  • 在需要對一系列子類進行約束,要求它們必須實現算法要求的某些方法時,可以採用模板方法模式,便於其他客戶程序按照這些方法操作子類。

優點
1、封裝不變部分,擴展可變部分。 2、提取公共代碼,便於維護。 3、行爲由父類控制,子類實現。

  • 提高代碼複用性,將相同部分的代碼放在抽象的父類中 ,而將不同的代碼放入不同的子類中
  • 提高了擴展性,將不同的代碼放入不同的子類中,通過對子類的擴展增加新的行爲
  • 實現了反向控制,通過一個父類調用其子類的操作,通過對子類的擴展增加新的行爲,實現了反向控制,符合“開閉原則”

缺點
每一個不同的實現都需要一個子類來實現,導致類的個數增加,使得系統更加龐大。

參考書籍:
王翔著 《設計模式——基於C#的工程化實現及擴展》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章