设计模式-模板方法设计模式

面向对象,万物皆对象,用一个雷来反应现实生活中的东西。

比如银行系统,业务升级---活期/定期,差别很小,就加判断(违背单一职责)。差别比较多,尤其是类比较复杂,类型拆分下。拆分之后,自然就有父类,代码重用。

利率:每个客户端都有利率,但是各不一样-----抽象方法。

Show():不分客户端是一样的,个别客户端是不一样的------虚方法。

有个复杂的多步骤的业务,定义一个父类(模板),模板负责完成流程,把步骤分解,固定不变的当前类(父类)----各不相同的子类,有的相同,有的不同的,用虚方法。

好处:可以扩展,职责分明。

/// <summary>
/// 银行客户端
/// </summary>
public abstract class AbstractClient
{
    public void Query(int id, string name, string password)
    {
        if (this.CheckUser(id, password))
        {
            double balance = this.QueryBalance(id);
            double interest = this.CalculateInterest(balance);
            this.Show(name, balance, interest);
        }
        else
        {
            Console.WriteLine("账户密码错误");
        }
    }

    public bool CheckUser(int id, string password)
    {
        return DateTime.Now < DateTime.Now.AddDays(1);
    }

    public double QueryBalance(int id)
    {
        return new Random().Next(10000, 1000000);
    }

    /// <summary>
    /// 活期  定期  利率不同
    /// </summary>
    /// <param name="balance"></param>
    /// <returns></returns>
    public abstract double CalculateInterest(double balance);

    public virtual void Show(string name, double balance, double interest)
    {
        Console.WriteLine("尊敬的{0}客户,你的账户余额为:{1},利息为{2}",
            name, balance, interest);
    }
    //private void Show(string name, double balance, double interest)
    //{
    //    Console.WriteLine("尊贵的{0} vip客户,您的账户余额为:{1},利息为{2}",
    //        name, balance, interest);
    //}

}
/// <summary>
/// 银行客户端
/// </summary>
public class Client
{
    public void Query(int id, string name, string password)
    {
        if (this.CheckUser(id, password))
        {
            double balance = this.QueryBalance(id);
            double interest = this.CalculateInterest(balance);
            this.Show(name, balance, interest);
        }
        else
        {
            Console.WriteLine("账户密码错误");
        }
    }
    public bool CheckUser(int id, string password)
    {
        if (true) { }
        else { }

        return DateTime.Now < DateTime.Now.AddDays(1);
    }

    public double QueryBalance(int id)
    {
        if (true) { }
        else { }

        return new Random().Next(10000, 1000000);
    }
    public double CalculateInterest(double balance)
    {
        if (true) { }
        else { }
        return balance * 0.005;
    }

    public void Show(string name, double balance, double interest)
    {
        Console.WriteLine("尊敬的{0}客户,你的账户余额为:{1},利息为{2}",
            name, balance, interest);
    }
}
View Code
 /// <summary>
 /// 银行客户端
 /// </summary>
 public class ClientCurrent : AbstractClient
 {
     /// <summary>
     /// 活期  定期  利率不同
     /// </summary>
     /// <param name="balance"></param>
     /// <returns></returns>
     public override double CalculateInterest(double balance)
     {
         return balance * 0.001;
     }
 }
 /// <summary>
 /// 银行客户端
 /// </summary>
 public class ClientRegular : AbstractClient
 {
     /// <summary>
     /// 活期  定期  利率不同
     /// </summary>
     /// <param name="balance"></param>
     /// <returns></returns>
     public override double CalculateInterest(double balance)
     {
         return balance * 0.003;
     }
 }
 /// <summary>
 /// 银行客户端
 /// </summary>
 public class ClientVip : AbstractClient
 {
     /// <summary>
     /// 活期  定期  利率不同
     /// </summary>
     /// <param name="balance"></param>
     /// <returns></returns>
     public override double CalculateInterest(double balance)
     {
         return balance * 0.005;
     }

     public override void Show(string name, double balance, double interest)
     {
         Console.WriteLine("尊贵的{0} vip客户,您的账户余额为:{1},利息为{2}",
             name, balance, interest);
     }
 }
{
    AbstractClient client = new ClientCurrent();
    client.Query(387, "冰乐", "123456");
}
{
    AbstractClient client = new ClientRegular();
    client.Query(448, "冰乐", "000000");
}
{
    AbstractClient client = new ClientVip();
    client.Query(259, "冰乐", "251146");
}

模板方法设计模式,好像就只是抽象类+子类。

 

posted @ 2019-09-19 20:15  冰乐  阅读(289)  评论(0编辑  收藏  举报