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