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 }
作者:可达鸭要进化
出处:http://www.cnblogs.com/Aries-rong/
本文版权归作者和博客园共有,欢迎转载,但是未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。