定義一個(抽象)父類的虛方法中算法的大概骨架,再將詳細算法步驟放到子類中重寫(override)實現。
模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
UML
代碼
//聲明一個抽象父類
abstract class AbstractClass
{
//聲明一個抽象方法
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
public void TemplateMethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
Console.WriteLine("");
}
}
//聲明一個繼承父類的子類A
class ConcreteClassA : AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("A類中方法1的實現");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("A類中方法2的實現");
}
}
//再聲明一個繼承父類的子類B
class ConcreteClassB : AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("B類中方法1實現");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("B類中的方法2實現");
}
}
// test
AbstractClass c;
c = new ConcreteClassA();
c.TemplateMethod();
c = new ConcreteClassB();
c.TemplateMethod();
result
A類中方法1的實現
A方法2實現
B類中方法1的實現
B方法2實現
示例二: unity腳本
// 定義一個父類
public class BaseUIForm : MonoBehaviour
{
private void Awake()
{
//初始化基礎信息
Initialization();
//初始化UI信息
InitUIInfo();
//初始化UI按鈕點擊事件
InitButtonClickEvent();
}
/// <summary>
/// 定義一個虛方法:初始化UI按鈕點擊事件
/// </summary>
protected virtual void InitButtonClickEvent()
{
// 父類的這個虛函數中還沒有給出任何概覽方法和步驟
}
}
// 子類繼承父類
public class ArchUIForm : BaseUIForm
{
/// <summary>
/// 子類重寫父類的虛方法,對父類中的概覽步驟展開詳細的算法處理:點擊按鈕後調用別處定義好的方法
/// </summary>
protected override void InitButtonClickEvent()
{
// 點擊按鈕後調用退出函數
RegisterButtonObjectEvent("BtnExit",
p =>
{
CloseUIForm();
}
);
}
}
模板方法模式的優缺點
模板方法優點:
通過把不變行爲搬移到超類,去除子類中的重複代碼來體現它的優勢。也就是說模板方法提供了一個很好的代碼複用平臺, 模板方法模式在抽象類中定義了算法實現的概覽步驟,然後把具體的細節步驟放到子類中去實現,從而使所有子類複用了父類的代碼,所以模板方法模式是基於繼承的一種實現代碼複用的技術。
優點:
- 實現了代碼複用
- 能夠靈活應對子步驟的變化,符合開放-封閉原則
缺點:
因爲引入了一個抽象類,如果具體實現過多的話,需要用戶或開發人員需要花更多的時間去理清類之間的關係。
引用:
https://blog.csdn.net/u010921682/article/details/82589789
https://blog.csdn.net/xuanyin235/article/details/88812487