设计模式之☞策略模式
程序员文章站
2022-04-24 21:57:28
策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。 今天来通过一个案例,来讲一下商场的促销案例。一般商场会有那些活动呢?总结了下,一般会有这3种促销活动:1、正常收费;2、打折;3、满多少返多少 面向对象的编程,并不是类越多越好,类的划分 ......
策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
今天来通过一个案例,来讲一下商场的促销案例。一般商场会有那些活动呢?总结了下,一般会有这3种促销活动:1、正常收费;2、打折;3、满多少返多少
面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的抽象集合才是类。
现金收费抽象类:
1 abstract class cashsupper //现金收费抽象类 2 { 3 public abstract double acceptcash(double money);//现金收取类的抽象方法,收取现金,参数为原价,返回为当前价 4 }
正常收费子类:
1 class cashnormal : cashsupper //正常收费子类 2 { 3 public override double acceptcash(double money) 4 { 5 return money; 6 } 7 }
打折收费子类:
1 class cashrebate : cashsupper //打折收费子类 2 { 3 private double moneryrebate = 1d; 4 public cashrebate(string moneryrebate) 5 { 6 this.moneryrebate = double.parse(moneryrebate); //打折收费,初始化时,必须要输入折扣率,如八折,就是0.8 7 } 8 public override double acceptcash(double money) 9 { 10 return money * moneryrebate; 11 } 12 }
返利收费子类:
1 class cashreturn : cashsupper 2 { 3 private double monerycondition = 0.0d; 4 private double moneryreturn = 0.0d; 5 public cashreturn(string monerycondition,string moneryreturn) //返利收费,初始化时必须要输入返利条件和返利值,比如满300返100,则monerycondition=300,moneryreturn=100 6 { 7 this.monerycondition =double.parse(monerycondition); 8 this.moneryreturn = double.parse(moneryreturn); 9 } 10 public override double acceptcash(double money) 11 { 12 double result = money; 13 if (money>=monerycondition) //若大于返利条件,则需要减去返利值 14 { 15 result = money - math.floor(money / monerycondition) * moneryreturn; 16 } 17 return result; 18 } 19 }
现金收费工厂类:
1 class cashfactory 2 { 3 public static cashsupper createcashaccept(string type) 4 { 5 cashsupper cs = null; 6 switch (type) 7 { 8 case "正常收费": 9 cs = new cashnormal(); 10 break; 11 case "满300反100": 12 cashreturn cr1 = new cashreturn("300","100"); 13 cs = cr1; 14 break; 15 case "打8折": 16 cashrebate cr2 = new cashrebate("0.8"); 17 cs = cr2; 18 break; 19 } 20 return cs; 21 } 22 }
cashcontext类:
1 class cashcontext 2 { 3 private cashsupper cs=null; //声明一个cashsuper 4 public cashcontext(string type) //表示收费的类型 5 { 6 switch (type) 7 { 8 case "正常收费": 9 cashnormal cs0 = new cashnormal(); 10 cs = cs0; 11 break; 12 case "满300返100": 13 cashreturn cr1 = new cashreturn("300","100"); 14 cs = cr1; 15 break; 16 case "打8折": 17 cashrebate cr2 = new cashrebate("0.8"); //将实例化具体策略的过程由客户端转移到context类中。简单工厂的引用 18 cs = cr2; 19 break; 20 } 21 } 22 public double getresult(double money) 23 { 24 return cs.acceptcash(money); //根据收费策略的不同,获得计算结果 25 } 26 }
界面:
调用:
1 double total = 0.0d; //用户总计 2 private void btnok_click(object sender, eventargs e) 3 { 4 cashcontext cc = new cashcontext(cmbtype.selecteditem.tostring()); 5 double totalprices = 0d; 6 totalprices = cc.getresult(convert.todouble(txtprice.text)*convert.todouble(txtnumber.text)); //通过对context的getresult方法的调用,可以得到收取费用的结果,让具体算法与客户进行隔离 7 total = total + totalprices; 8 listbox1.items.add("单价:"+txtprice.text+"数量:"+txtnumber.text+" "+cmbtype.selecteditem+"合计:"+totalprices.tostring()); 9 label5.text = total.tostring(); 10 }
下一篇: 初识并发编程