3 模闆方法模式應用執行個體
下面通過一個應用執行個體來進一步學習和了解模闆方法模式。
1. 執行個體說明
某軟體公司欲為某銀行的業務支撐系統開發一個利息計算子產品,利息計算流程如下: (1) 系統根據賬号和密碼驗證使用者資訊,如果使用者資訊錯誤,系統顯示出錯提示; (2) 如果使用者資訊正确,則根據使用者類型的不同使用不同的利息計算公式計算利息(如活期賬戶和定期賬戶具有不同的利息計算公式); (3) 系統顯示利息。 試使用模闆方法模式設計該利息計算子產品。 |
2. 執行個體類圖
通過分析,本執行個體結構圖如圖3所示。
圖3 銀行利息計算子產品結構圖
在圖3中,Account充當抽象類角色,CurrentAccount和SavingAccount充當具體子類角色。
3. 執行個體代碼
(1) Account:賬戶類,充當抽象類。
//Account.cs
using System;
namespace TemplateMethodSample
{
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 void Handle(string account, string password)
{
if (!Validate(account,password))
{
Console.WriteLine("賬戶或密碼錯誤!");
return;
}
CalculateInterest();
Display();
}
}
}
(2) CurrentAccount:活期賬戶類,充當具體子類。
//CurrentAccount.cs
using System;
namespace TemplateMethodSample
{
class CurrentAccount : Account
{
//覆寫父類的抽象基本方法
public override void CalculateInterest()
{
Console.WriteLine("按活期利率計算利息!");
}
}
}
(3) SavingAccount:定期賬戶類,充當具體子類。
//SavingAccount.cs
using System;
namespace TemplateMethodSample
{
class SavingAccount : Account
{
//覆寫父類的抽象基本方法
public override void CalculateInterest()
{
Console.WriteLine("按定期利率計算利息!");
}
}
}
(4) 配置檔案App.config,在配置檔案中存儲了具體子類的類名。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="subClass" value="TemplateMethodSample.CurrentAccount"/>
</appSettings>
</configuration>
(5) Program:用戶端測試類
//Program.cs
using System;
using System.Configuration;
using System.Reflection;
namespace TemplateMethodSample
{
class Program
{
static void Main(string[] args)
{
Account account;
//讀取配置檔案
string subClassStr = ConfigurationManager.AppSettings["subClass"];
//反射生成對象
account = (Account)Assembly.Load("TemplateMethodSample").CreateInstance(subClassStr);
account.Handle("張無忌", "123456");
Console.Read();
}
}
}
4. 結果及分析
編譯并運作程式,輸出結果如下:
賬号:張無忌 密碼:123456 按活期利率計算利息! 顯示利息! |
如果需要更換具體子類,無須修改源代碼,隻需修改配置檔案App.config,例如将活期賬戶(CurrentAccount)改為定期賬戶(Saving Account),隻需将存儲在配置檔案中的具體子類CurrentAccount改為SavingAccount,如下代碼所示:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="subClass" value="TemplateMethodSample.SavingAccount"/>
</appSettings>
</configuration>
重新運作用戶端程式,輸出結果如下:
賬号:張無忌 密碼:123456 按定期利率計算利息! 顯示利息! |
如果需要增加新的具體子類(新的賬戶類型),原有代碼均無須修改,完全符合開閉原則。
【作者:劉偉 http://blog.csdn.net/lovelion】