设计模式——策略模式

问题:商场促销问题,针对不同的顾客有不同的打折方式,计算实际应付金额

分析:1.各种促销手段下应付金额的计算方式中均有“获得商品正常销售价格,输出优惠后顾客应付金额”的步骤,因此可以抽象一个收费类,各种优惠活动的具体实现方法类来继承这个抽象类;2.具体情况下应该选择实现哪个优惠策略


抽象类和具体策略实现类代码:

//抽象一个收费类
   abstract  class CashSuper
    {
       public abstract double acceptCash(double money);
    }

    //正常收费类
   class CashNormal : CashSuper
   {
       public override double acceptCash(double money)
       {
           return money;
       }
   }

    //打折收费子类
   class CashRebate : CashSuper
   {
       private double moneyRebate = 1d;
       public CashRebate(string moneyRabe)
       {
           this.moneyRebate = double.Parse(moneyRabe);

       }
       public override double acceptCash(double money)
       {
           return money * moneyRebate;
       }
   }

选择哪个类来实现,方法一:简单工厂来实现

   //现金收费工厂类
   class CashFactory
   {
       public static CashSuper createCashAccept(string type)
       {
           CashSuper cs = null;
           switch (type)
           { 
               case"正常收费":
                   cs = new CashNormal();
                   break;
               case "打八折":
                   CashRebate cr = new CashRebate("0.8");
                   cs = cr;
                   break;
           }
           return cs;
       }
   }
客户端代码:

            CashSuper csuper = CashFactory.createCashAccept(cmbType.SelectedItem.ToString());  //工厂类中选择要实例化哪个具体优惠方法类
            double totalPrices = 0d;
            totalPrices = csuper.acceptCash(Convert.ToDouble(textBox2.Text) * Convert.ToDouble(textBox1.Text));
            total = total + totalPrices;
            textBox3.Text = total.ToString();
类图:

从图中可以看出,若商店要增加一种促销策略,如:现有“正常售价”和”打八折”,若想再增加一种“打五折”的活动,其实跟打八折实质是一样的不需要增加算法类,但是需要在工厂中加case判断条件,在form下拉框中做相应改动;若想增加“满多少减多少”的活动,相当于增加一种新的算法,需要在增加一个算法类继承抽象的收费类,再在工厂中加case条件,改动下拉框。


选择哪个类来实现,方法二:策略模式实现

   class CashContext
   {
       private CashSuper cs;
       public CashContext(CashSuper csuper)
       {
           this.cs = csuper;          //具体的收费策略
       }

       public double GetResult(double money)
       {
           return cs.acceptCash(money);   //获取优惠活动后,顾客应付金额数
       }
   }
客户端代码:

            CashContext cc = null;
            switch(cmbType.SelectedItem.ToString())
            {
                case"正常收费":
                    cc = new CashContext(new CashNormal());
                    break;
                case"打八折":
                    cc = new CashContext(new CashRebate("0.8"));
                    break;

            }

            double totalPrices = 0d;
            totalPrices = cc.GetResult(Convert.ToDouble(textBox2.Text) * Convert.ToDouble(textBox1.Text));
            total = total + totalPrices;
            textBox3.Text = total.ToString();
类图:


   简单工厂实现时,客户端需要认识两个类CashSuper和CashFactory,工厂类来判断new哪个具体类;策略模式客户端只需要认识一个类(降低耦合),得到一个结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值