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

模板方法模式应用实例

      下面通过一个应用实例来进一步学习和理解模板方法模式。

 

      1. 实例说明

      某软件公司欲为某银行的业务支撑系统开发一个利息计算模块,利息计算流程如下:

      (1) 系统根据账号和密码验证用户信息,如果用户信息错误,系统显示出错提示;

      (2) 如果用户信息正确,则根据用户类型的不同使用不同的利息计算公式计算利息(如活期账户和定期账户具有不同的利息计算公式);

      (3) 系统显示利息。

      试使用模板方法模式设计该利息计算模块。

     

       2. 实例类图

      通过分析,本实例结构图如图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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值