模板方法模式
模板方法模式是面向?qū)ο笙到y(tǒng)中非常樸實的一種模式,體現(xiàn)出面向?qū)ο笤O(shè)計中繼承和多態(tài)的基本特征。在開發(fā)應(yīng)用的過程中,往往會在初期規(guī)劃一些較粗粒度的算法,而且對參與計算的對象進(jìn)行抽象,明確算法會使用到哪些方法,每個方法可以提供哪些支持,但此時每個方法本身并沒有細(xì)化;隨著開發(fā)過程的展開,我們可能會具體實現(xiàn)每個方法,或者對最初的一些方法進(jìn)行替換,覆蓋上新的內(nèi)容,這樣就在一個相對固定的算法框架下,通過子類(或其他方法)的變化,實現(xiàn)了算法的差異性。
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");
}
}
適用場景
- 在實現(xiàn)一個算法時,發(fā)現(xiàn)其中有些部分非常易變,或者很容易隨著運行環(huán)境、后續(xù)開發(fā)的不同產(chǎn)生而很多變化,此時就按照模板方法模式可以把它們抽象出來,供子類完成。
- 在需要對一系列子類進(jìn)行約束,要求它們必須實現(xiàn)算法要求的某些方法時,可以采用模板方法模式,便于其他客戶程序按照這些方法操作子類。
優(yōu)點
1、封裝不變部分,擴展可變部分。 2、提取公共代碼,便于維護(hù)。 3、行為由父類控制,子類實現(xiàn)。
- 提高代碼復(fù)用性,將相同部分的代碼放在抽象的父類中 ,而將不同的代碼放入不同的子類中
- 提高了擴展性,將不同的代碼放入不同的子類中,通過對子類的擴展增加新的行為
- 實現(xiàn)了反向控制,通過一個父類調(diào)用其子類的操作,通過對子類的擴展增加新的行為,實現(xiàn)了反向控制,符合“開閉原則”
缺點
每一個不同的實現(xiàn)都需要一個子類來實現(xiàn),導(dǎo)致類的個數(shù)增加,使得系統(tǒng)更加龐大。
參考書籍:
王翔著 《設(shè)計模式——基于C#的工程化實現(xiàn)及擴展》
|