模板方法模式深度解析(二)
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】
相關文章
- 模板方法模式深度解析(三)模式
- 模板方法模式深度解析(一)模式
- 結合案例深入解析模板方法設計模式設計模式
- 模板方法模式模式
- 模板方法模式(Template)模式
- javascript模板方法模式JavaScript模式
- 策略模式與模板方法模式模式
- 設計模式-模板方法模式設計模式
- 設計模式 ——— 模板方法模式設計模式
- 命令模式 & 策略模式 & 模板方法模式
- 深度解析單例模式單例模式
- Java設計模式-模板方法模式Java設計模式
- 設計模式之【模板方法模式】設計模式
- js設計模式--模板方法模式JS設計模式
- 設計模式之模板方法模式設計模式
- 設計模式-模板方法模式.md設計模式
- 設計模式(五)——模板方法模式設計模式
- 設計模式系列(圖文解析,附帶原始碼) - 模板方法設計模式原始碼
- 模板方法設計模式設計模式
- 淺談模板方法模式模式
- 【設計模式】--模板方法設計模式
- java單例模式深度解析Java單例模式
- PHP設計模式之模板方法模式PHP設計模式
- 簡說設計模式——模板方法模式設計模式
- python設計模式-模板方法模式Python設計模式
- 設計模式實戰-模板方法模式設計模式
- 極簡設計模式-模板方法模式設計模式
- 【大話設計模式】—— 模板方法模式設計模式
- 設計模式之模板方法設計模式
- 聊一聊模板方法模式模式
- Java描述設計模式(19):模板方法模式Java設計模式
- C#設計模式(14)——模板方法模式C#設計模式
- 《Head First 設計模式》:模板方法模式設計模式
- Java設計模式之(十三)——模板方法模式Java設計模式
- javascript設計模式 之 8 模板方法模式JavaScript設計模式
- 我的Java設計模式-模板方法模式Java設計模式
- 23種設計模式之--模板方法模式設計模式
- 策略模式和模板方法模式的異同模式