zoukankan      html  css  js  c++  java
  • 设计模式-模板方法设计模式

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

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

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

    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");
    }

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

  • 相关阅读:
    Https的请求过程
    计算机网络知识
    数据结构之图
    Python3线程池进程池
    数据结构之堆heapq
    EffectivePython并发及并行
    EffectivePython类与继承
    EffectivePython并发及并行
    5.19完全数
    5.18数字全排列
  • 原文地址:https://www.cnblogs.com/taotaozhuanyong/p/11552305.html
Copyright © 2011-2022 走看看