欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式之☞策略模式

程序员文章站 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     }
view code

正常收费子类:

设计模式之☞策略模式
1     class cashnormal : cashsupper //正常收费子类
2     {
3         public override double acceptcash(double money)
4         {
5             return money;
6         }
7     }
view code

打折收费子类:

设计模式之☞策略模式
 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     }
view code

返利收费子类:

设计模式之☞策略模式
 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     }
view code

现金收费工厂类:

设计模式之☞策略模式
 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     }
view code

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     }
view code

 

界面:

设计模式之☞策略模式

调用:

设计模式之☞策略模式
 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         }
view code