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

      模板设计模式,是处理程序按照某中顺序执行,通过类和行为分离,来处理的设计模式之一。主要是是关注类和行为之间的分离。



    生活实例,假如今天4S店购买了大奔一辆(你现在也是有车一族了),付款后,你每次需要驾车外去,都需要操作一下步骤:
     1.打开车门
     2.插入钥匙
     3.启动发送机
     4.挂挡
     5.出发
     6.刹车
     7.歇火停车
    大家可以通过上面实例中看出,这个过程中都是有先后顺序的,可以直接定义一个Car类,上面所有的行为都是按照顺序依次调用即可。通常情况车是你自己开,这中行为都是在Car类中依次执行即可,但是有一天,你朋友借车外出,他这个人比较奇葩,在这个过程中,他需要吃点东西,和朋友打打电话,听听音乐。因此你发现,上面类中Car行为就满足不了他的需求了,需要添加相对应的行为。在这个过程中,我们无法捕捉不同的人操作需要都不一样,但是他们相同(固定)操作:
     1.打开车门
     2.插入钥匙
     3.启动发送机
     4.挂挡
     5.出发
     6.刹车
     7.歇火停车
因此我们可以把这些固定操作顺序,定义在Car类中,并且提供相对应的行为同时定义一个供外界自己处理的行为。因此下面按照这样来实现
     1.打开车门
     2.插入钥匙
     3.启动发送机
     4.挂挡
     5.出发
        5.1处理特定行为
     6.刹车
     7.歇火停车
然后我们默认实现特定行为实现(听歌),其他人继承Car类,可以复写特定行为,还可以增加自己爱好行为。
因此,通过上面实例,我们可以定义Car类,默认实现上面行为,提供个性化行为让子类继承实现。
当然我个人不实现上面这个实例,通过演示我们去银行查账情况,1.输入密码;2.显示账户余额;3.计算利息

namespace 模板方法_设计模式
{
    class RoutineMehods
    {
        /// <summary>
        /// 校验用户
        /// </summary>
        /// <param name="id"></param>
        /// <param name="code"></param>
        /// <param name="password"></param>
        public void Queryt(string id,string code,string password)
        {
            if (!string.IsNullOrEmpty(code))
            {
                int count = this.GetNameCount();
                double lx = GetNameLx(count);
                this.ShowName(code,count,lxDq);
            }
            else
            {
                Console.WriteLine("账号密码错误");
            }
        }
        /// <summary>
        ///  获取账户余额
        /// </summary>
        private int GetNameCount()
        {
            Random random = new Random();
            return random.Next(10000,100000);
        }

        /// <summary>
        /// 计算活期利息
        /// </summary>
        /// <param name="count">账户余额</param>
        /// <returns></returns>
        protected double GetNameLx(int count)
        {
            return count * 0.04;
        }

        /// <summary>
        /// 显示查询结果
        /// </summary>
        /// <param name="code">账户</param>
        /// <param name="count">总金额</param>
        /// <param name="countLx">利息总额</param>
        protected void ShowName(string code,int count,double countLx)
        {
            Console.WriteLine("当前账户:{0},账户余额:{1},利息总额:{2}",code,count,countLx);
        }
    }
}

Main方法调用

static void Main(string[] args)
{
    RoutineMehods();
    Console.ReadKey();
}

private static void RoutineMehods()
{
    RoutineMehods routine = new RoutineMehods();
    routine.Queryt("123", "王炸", "7852147");
}

执行结果:

银行嘛,大家都是知道的,定期推去不同存款方式,假设本次推送活期利息为0.04,定期利息0.05,那么我们就需要修改程序

        /// <summary>
        /// 计算利息
        /// </summary>
        /// <param name="count">账户余额</param>
        /// <returns></returns>
        protected double GetNameLxHq(int count,bool isGrad)
        {
            double lv = 0.04;
            if (isGrad)
            {
                lv = 0.05;
            }
            return count * lv;
        }

此时后期有推出理财产品等其他活动。。。。因为我们使用模板方法设计模式,实现如下:
设计一个银行类

namespace 模板方法_设计模式
{
    public abstract class AbstractBank
    {
        /// <summary>
        /// 校验用户
        /// </summary>
        /// <param name="id"></param>
        /// <param name="code"></param>
        /// <param name="password"></param>
        public void Queryt(string id, string code, string password)
        {
            if (!string.IsNullOrEmpty(code))
            {
                int count = this.GetNameCount();
                double lxDq = this.GetNameLx(count);
                this.ShowName(code, count, lxDq);
            }
        }
        /// <summary>
        ///  获取账户余额
        /// </summary>
        private int GetNameCount()
        {
            Random random = new Random();
            return random.Next(10000, 100000);
        }

        /// <summary>
        /// 计算利息
        /// </summary>
        /// <param name="count">账户余额</param>
        /// <returns></returns>
        protected virtual double GetNameLx(int count)
        {
            return count * 0.04;
        }

        /// <summary>
        /// 显示查询结果
        /// </summary>
        /// <param name="code">账户</param>
        /// <param name="count">总金额</param>
        /// <param name="countLx">利息总额</param>
        protected virtual void ShowName(string code, int count, double countLx)
        {
            Console.WriteLine("当前账户:{0},账户余额:{1},利息总额:{2}", code, count, countLx);
        }
    }
}

定期产品类:包含格式化产品理财

namespace 模板方法_设计模式
{
    class DingQiClass : AbstractBank
    {
        protected override double GetNameLx(int count)
        {
            Console.WriteLine("定期查询成功!");
            return count * 0.05;
        }
        protected override void ShowName(string code, int count, double countLx)
        {
            base.ShowName(code, count, countLx);
            Console.WriteLine("理财收益高,投资需谨慎");
        }
    }
}

Main方法

       static void Main(string[] args)
        {
            TempleMehods();
            Console.ReadKey();
        }

        private static void TempleMehods()
        {
           AbstractBank abstractBank = new DingQiClass();
            abstractBank.Queryt("456","拖拉机","896325");
        }

运行结果:

活期用户

       static void Main(string[] args)
        {
            TempleMehods();
            Console.ReadKey();
        }

        private static void TempleMehods()
        {
           AbstractBank abstractBank = new HuoQiClass();
            abstractBank.Queryt("456","拖拉机","896325");
        }

运行结果:

 


       总结:
       通过上面两个实例,我们不难看出模板方法设计模式,注重的是类和行为之间的分离,侧重于类和方法之间的关系,通过合理使用普通方法\构造方法\虚方法,使我们程序逻辑解耦,代码重用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值