当前位置: 移动技术网 > IT编程>开发语言>.net > 设计模式之☞策略模式

设计模式之☞策略模式

2019年01月01日  | 移动技术网IT编程  | 我要评论

狼烟北平txt下载,怪兽:黑暗大陆,ap豹女

  策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。

  今天来通过一个案例,来讲一下商场的促销案例。一般商场会有那些活动呢?总结了下,一般会有这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

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网