模板方法模式 Template Method
Intro
模板方法模式,定義一個操作中的算法骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算的結構即使重定義該算法的某些特定步驟
這里的“算法”,我們可以理解為廣義上的“業務邏輯”,並不特指數據結構和算法中的“算法”。這里的算法骨架就是“模板”,包含算法骨架的方法就是“模板方法”,這也是模板方法模式名字的由來。
使用場景
模板方法模式是通過把不變行為搬移到基類中,去除子類中的重復代碼來體現它的優勢,提供了一個很好的代碼復用平台。
當不變的和可變的行為在方法的子類實現中混合在一起的時候,不變的行為就會在子類中重復出現,我們通過可以借助模板方法模式把這些行為搬移到單一的地方,這樣就幫助子類擺脫重復的不變行為的糾纏。
Sample
來看一個簡單的示例:
internal abstract class AbstractClass
{
protected abstract void PrimitiveOperation1();
protected abstract void PrimitiveOperation2();
public void TemplateMethod()
{
Console.WriteLine("-------Begin-------");
PrimitiveOperation1();
PrimitiveOperation2();
Console.WriteLine("-------End-------");
}
}
internal class ConcreteClassA : AbstractClass
{
protected override void PrimitiveOperation1()
{
Console.WriteLine("具體類A 方法1 的實現");
}
protected override void PrimitiveOperation2()
{
Console.WriteLine("具體類A 方法2 的實現");
}
}
internal class ConcreteClassB : AbstractClass
{
protected override void PrimitiveOperation1()
{
Console.WriteLine("具體類B 方法1 的實現");
}
protected override void PrimitiveOperation2()
{
Console.WriteLine("具體類B 方法2 的實現");
}
}
More
模板模式有兩大作用:復用和擴展。其中,復用指的是,所有的子類可以復用父類中提供的模板方法的代碼。擴展指的是,框架通過模板模式提供功能擴展點,讓框架用戶可以在不修改框架源碼的情況下,基於擴展點定制化框架的功能。
我一直覺得模板方法這個設計模式是最簡單最實用最能體現面向對象特性的一個設計模式
面向對象的三大特性,封裝、繼承、多態在模板方法模式中都有體現
一些通用的邏輯通常會 封裝 在父類中,不同的部分通常在父類中定義一個抽象方法或者虛方法(具體根據實際場景選擇),然后在子類中 繼承 父類以復用父類中的通用邏輯,在具體的子類中實現需要重寫的邏輯,以此來實現 多態
模板方法模式在有些場景下可能需要一些變通,標准的模板方法模式需要繼承,但是 C# 是單繼承的語言,在沒有辦法繼承的時候,通常我們可以借助委托來實現,不同的邏輯需要重寫的邏輯抽象換成一個委托,通過委托來替換不同的實現邏輯