天天看點

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

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】

繼續閱讀