模板方法模式深度解析(二)

Liuwei-Sunny發表於2012-12-15

3 模板方法模式應用例項

      下面通過一個應用例項來進一步學習和理解模板方法模式。

 

      1. 例項說明

      某軟體公司欲為某銀行的業務支撐系統開發一個利息計算模組,利息計算流程如下:

      (1) 系統根據賬號和密碼驗證使用者資訊,如果使用者資訊錯誤,系統顯示出錯提示;

      (2) 如果使用者資訊正確,則根據使用者型別的不同使用不同的利息計算公式計算利息(如活期賬戶和定期賬戶具有不同的利息計算公式);

      (3) 系統顯示利息。

      試使用模板方法模式設計該利息計算模組。

     

       2. 例項類圖

      通過分析,本例項結構圖如圖3所示。

3 銀行利息計算模組結構圖

       在圖3中,Account充當抽象類角色,CurrentAccountSavingAccount充當具體子類角色。

 

       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

相關文章