C#学习笔记-策略模式

题目:做一个商场收银的小程序,可能会出现的情况包括:正常收费,九折优惠,七折优惠,满300减50等各种不同随时会变化的优惠活动。

界面如下:

 

分析:

首先我们对于收钱写一个父类CashSuper。这个父类是用来包含其他的各种收费方式的:正常收费、七折优惠、八折优惠、九折优惠、满300减50、满400减70、满500减100等情况,其中折扣优惠虽然不同,但是类型相似,满减优惠同理,故此我们可以将正常收费、折扣优惠与满减优惠分别划分为三个不同的类:CashNormal、CashRebate、CashReturn。

CashSuper这个父类是用于继承的,所以我们设置为abstract用来被重写的,其次这个父类所包含的的三个子类都会共同调用到一个参数:那就是实际需要收到的商品的价格,所以我们的参数只需要传进来共同的参数:acceptMoney即可。

1 abstract class CashSuper
2     {
3         public abstract double acceptCash(double acceptMoney);
4     }

然后就是正常收费:CashNormal

首先他从父类获得参数是实际需要收到的商品的价格,他本身事正常收费没有任何的优惠,所以直接返回从父类传进来的值即可。

1     class CashNormal : CashSuper
2     {
3         public override double acceptCash(double acceptMoney)
4         {
5             return acceptMoney;
6         }
7     }

折扣优惠:CashRebate

他和正常收费类似,继承于父类CashSuper,会获得来自于父类的参数,得到实际需要收到的商品的价格,但是他需要实现的是对商品进行打折优惠,所以他需要自己定义一个折扣优惠参数,这样别人调用他的时候将折扣参数传进来,他就可以通过对原价进行折扣优惠反馈给用户了

 1     class CashRebate : CashSuper
 2     {
 3         //这就是cashrebate的属性了
 4         private double monRebate = 1;
 5 
 6         //调用CashRebate的时候需要从外面将优惠程度传进来
 7         public CashRebate(string moneyRebate)
 8         {
 9             this.monRebate = double.Parse(moneyRebate);
10         }
11 
12         public override double acceptCash(double acceptMoney)
13         {
14             return acceptMoney * monRebate;
15         }
16     }

满减优惠:CashReturn

这个与折扣优惠类似了,只是他有两个参数而已:满减的水平线,和减扣多少。故此给此类定义两个参数即可。

 1     class CashReturn : CashSuper
 2     {
 3         //这就是cashreturn的属性了
 4         private double CashLevel = 0;
 5         private double MoneyReturn = 0;
 6 
 7         //对外调用函数所以必须是public
 8         public CashReturn(string level,string MonReturn)
 9         {
10             this.CashLevel = double.Parse(level);
11             this.MoneyReturn = double.Parse(MonReturn);
12         }
13 
14         public override double acceptCash(double acceptMoney)
15         {
16             double result = acceptMoney;
17             if (acceptMoney >= CashLevel)
18             {
19                 result = acceptMoney - Math.Floor(acceptMoney / CashLevel) * MoneyReturn;
20             }
21             return result;
22         }
23     }

现在获得了几种优惠情况了,但是我们需要判断什么时候需要调用哪种优惠情况,这点我们通过用户的选择,用户将选择的优惠方式传输过来,我们再确定调用哪一种优惠方式,这就是利用简单工厂模式,将所有的优惠方式封装好,在进一步调用。

 1     class CashFactory
 2     {
 3         //CashSuper现在就类似double之类,返回值就是CashSuper
 4         public static CashSuper createCashAccept(string type)
 5         {
 6             CashSuper cs = null;
 7 
 8             switch (type)
 9             {
10                 case "正常收费":
11                     cs = new CashNormal();
12                     break;
13                 case "满300减50":
14                     cs = new CashReturn("300", "50");
15                     break;
16                 case "满500减100":
17                     cs = new CashReturn("500", "100");
18                     break;
19                 case "满400减70":
20                     cs = new CashReturn("400", "70");
21                     break;
22                 case "满900减200":
23                     cs = new CashReturn("900", "200");
24                     break;
25                 case "八折优惠":
26                     cs = new CashRebate("0.8");
27                     break;
28                 case "九折优惠":
29                     cs = new CashRebate("0.9");
30                     break;
31                 case "七折优惠":
32                     cs = new CashRebate("0.7");
33                     break;
34             }
35             return cs;
36         }
37     }

最后在用户接口调用上面的函数即可。

 1         private void ok_button_Click(object sender, EventArgs e)
 2         {
 3             /**对外这边需要了解两个函数
 4              * 1.CashFactory.createCashAccept,这个是为了确定每一次的购物时调用的哪一种优惠方式
 5              * 2.csuper.acceptCash,这个是为了获得每种优惠方式获得的优惠结果
 6              */
 7             CashSuper csuper = CashFactory.createCashAccept(typecomboBox.SelectedItem.ToString());
 8             
 9             totalPrices = csuper.acceptCash(double.Parse(unitPrice_textBox.Text) * double.Parse(amount_textBox.Text));
10             total += totalPrices;
11             listBox1.Items.Add("单价:" + unitPrice_textBox.Text.ToString() + " 数量:" + amount.ToString() + "  " + typecomboBox.SelectedItem.ToString() + " 合计:" + totalPrices.ToString());
12             resultLabel.Text = total.ToString();
13         }

 

转载于:https://www.cnblogs.com/Aries-rong/p/6956739.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值