3.10.1 模式意圖:
在系統有一些按照指定步驟執行的操作,這時如果將對應步驟的操作細節寫在一起,勢必會造成耦合度增加 ,不利于擴展,這時可以使用模板方法模式,抽象其中的順序步驟,將具體的操作細節留到對應的子類中。
3.10.2 模式概念:
它屬于行為型模式,定義一個操作中的算法骨架,將一些步驟延遲到子類中。模板方法使得子類可以不改變算法結構的同時,重新定義該算法的某些特定步驟。
3.10.3 模式元素:
- 模板抽象(Template)
- 模板細節(ConcreteTemplate)
3.10.4 代碼示例:
A.模板抽象類
public abstract class Template
{
public void TemplateMethod()
{
StepOne();
StepTwo();
StepThree();
}
protected abstract void StepOne();
protected abstract void StepTwo();
protected abstract void StepThree();
}
B.模板實現類
public class ConcreteTemplate : Template
{
protected override void StepOne()
{
Debug.Log($"{nameof(StepOne)}:打開冰箱門");
}
protected override void StepTwo()
{
Debug.Log($"{nameof(StepOne)}:大象塞進去");
}
protected override void StepThree()
{
Debug.Log($"{nameof(StepOne)}:冰箱門關上");
}
}
示例代碼調用
void UnitTest()
{
Template template = new ConcreteTemplate();
template.TemplateMethod();
}
打印日志
3.10.5 寫法對比:
略
3.10.6 模式分析:
模板方法抽象出對應操作步驟,使其操作抽象與操作細節分離,利于后期需求的變動,符合開閉原則。模板方法主要是利用
override
的特點,可以對新增步驟的變動以增量的形式添加,但也要注意隨之增加的子類數量,避免因覆蓋層級深、子類數量過多反而造成維護困難。
3.10.7 應用場景:
多個子類含有概念一致或執行步驟相同時,可以考慮使用模板方法模式。
3.10.8 小結:
模板方法在實際開發中使用的頻率較高,尤其是框架中自動注冊、加載、卸載的地方,都會見到模板方法模式的身影。