一、定義 定義一個操作中演算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類不改變一個演算法的結構即可重定義該演算法的特定步驟。模板方法是一種類行為型模式 二、描述 模板方法模式結構比較簡單,其核心是抽象類和其中的模板方法的設計,包含以下兩個角色: 1、AbstractClass(抽象類):在抽象 ...
一、定義
定義一個操作中演算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類不改變一個演算法的結構即可重定義該演算法的特定步驟。模板方法是一種類行為型模式
二、描述
模板方法模式結構比較簡單,其核心是抽象類和其中的模板方法的設計,包含以下兩個角色:
1、AbstractClass(抽象類):在抽象類中定義了一系列基本操作(Primitive Operations),這些基本操作可以是具體的,也可以是抽象的,每一個基本操作對應演算法的一個步驟,在其子類中可以重新定義或實現這些步驟。同時,在抽象類中實現了一個模板方法(Template Method),用於定義一個演算法的框架。
2、ConcreteClass(具體子類):抽象類的子類,用於實現在父類中聲明的抽象基本操作以完成子類特定演算法的步驟,也可以覆蓋在父類中已經實現的具體基本操作。
三、例子
X公司欲為某銀行的業務支撐系統開發一個利息計算模塊,利息計算流程如下:
(1)系統根據賬號和密碼驗證用戶信息,如果用戶信息錯誤,系統顯示錯誤提示。
(2)如果用戶信息正確,則根據用戶類型的不同使用不同的利息計算公式計算利息(例如活期賬戶和定期賬戶具有不同的利息計算公式)
(3)系統顯示利息。
Account:抽象類
public abstract class Account
{
// 基本方法 - 具體方法
public bool Validate(string account, string password)
{
Console.WriteLine("賬號 : {0}", account);
Console.WriteLine("密碼 : {0}", password);
if (account.Equals("張無忌") && password.Equals("123456"))
{
return true;
}
else
{
return false;
}
}
// 基本方法 - 抽象方法
public abstract void CalculateInterest();
// 基本方法 - 具體方法
public void Display()
{
Console.WriteLine("顯示利息");
}
// 基本方法 - 鉤子方法
public virtual bool IsAllowDisplay()
{
return true;
}
// 模板方法
public void Handle(string account, string password)
{
if (!Validate(account, password))
{
Console.WriteLine("賬戶或密碼錯誤,請重新輸入!");
return;
}
CalculateInterest();
if (IsAllowDisplay())
{
Display();
}
}
}
CurrentAccount、SavingAccount:活期存款、定期存款,充當具體子類
public class CurrentAccount : Account
{
// 重寫父類的抽象基本方法
public override void CalculateInterest()
{
Console.WriteLine("按活期利率計算利息!");
}
// 重寫父類的鉤子方法
public override bool IsAllowDisplay()
{
return base.IsAllowDisplay();
}
}
public class SavingAccount : Account
{
// 重寫父類的抽象基本方法
public override void CalculateInterest()
{
Console.WriteLine("按定期利率計算利息!");
}
// 重寫父類的鉤子方法
public override bool IsAllowDisplay()
{
return false;
}
}
Program:測試代碼
Account account = new CurrentAccount();
if (account != null)
{
account.Handle("張無忌", "123456");
}
Console.ReadLine();
四、總結
1、優點
(1)在父類中形式化地定義一個演算法,而由它的子類來實現細節的處理,在子類實現詳細的處理演算法時並不會改變演算法中步驟的執行次序。
(2)模板方法模式是一種代碼復用技術,在類庫設計中尤為重要,它提取了類庫中的公共行為,將公共行為放在父類中,而通過其子類來實現不同的行為,它鼓勵用戶恰當地使用繼承來實現代碼復用。
(3)模板方法模式可實現一種反向控制結構,通過子類覆蓋父類的鉤子方法來決定某一特定步驟是否需要執行。
(4)在模板方法模式中可以通過子類來覆蓋父類的基本方法,不同的子類可以提供基本方法的不同實現,更換和增加新的子類很方便,符合單一職責原則和開閉原則。
2、缺點
(1)模板方法模式需要為每一個基本方法的不同實現提供一個子類,如果父類中可變的基本方法太多,將會導致類的個數增加,系統會更加龐大,設計也會更加抽象,此時,可結合橋接模式來進行設計。
測試簽名