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
    {
        /// 
        /// 校验用户
        /// 
        /// 
        /// 
        /// 
        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("账号密码错误");
            }
        }
        /// 
        ///  获取账户余额
        /// 
        private int GetNameCount()
        {
            Random random = new Random();
            return random.Next(10000,100000);
        }

        /// 
        /// 计算活期利息
        /// 
        /// 账户余额
        /// 
        protected double GetNameLx(int count)
        {
            return count * 0.04;
        }

        /// 
        /// 显示查询结果
        /// 
        /// 账户
        /// 总金额
        /// 利息总额
        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,那么我们就需要修改程序

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

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

namespace 模板方法_设计模式
{
    public abstract class AbstractBank
    {
        /// 
        /// 校验用户
        /// 
        /// 
        /// 
        /// 
        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);
            }
        }
        /// 
        ///  获取账户余额
        /// 
        private int GetNameCount()
        {
            Random random = new Random();
            return random.Next(10000, 100000);
        }

        /// 
        /// 计算利息
        /// 
        /// 账户余额
        /// 
        protected virtual double GetNameLx(int count)
        {
            return count * 0.04;
        }

        /// 
        /// 显示查询结果
        /// 
        /// 账户
        /// 总金额
        /// 利息总额
        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");
        }

运行结果:

 


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

你可能感兴趣的:(C#,模板方法设计模式,设计模式)