标签:style blog http io ar color os 使用 sp
设计一个商场打折计费的软件,可以实现打折,满300送100等优惠功能。
我们先把4个计算的类写出来。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 策略模式 8 { 9 // 核心类,定义了具体实现功能。算法的不同实现由各个类来完成。 10 abstract class CashSuper 11 { 12 public abstract double AcceptCash(double money); 13 } 14 15 class CashNormal : CashSuper 16 { 17 public override double AcceptCash(double money) 18 { 19 return money; 20 } 21 } 22 23 class CashRebate : CashSuper 24 { 25 private double rebate = 1.0d; 26 public CashRebate(double rebate) 27 { 28 this.rebate = rebate; 29 } 30 public override double AcceptCash(double money) 31 { 32 return this.rebate * money; 33 } 34 } 35 36 class CashReturn : CashSuper 37 { 38 private double moneyCondition; 39 private double moneyReturn; 40 41 public CashReturn(double moneyCondition, double moneyReturn) 42 { 43 this.moneyCondition = moneyCondition; 44 this.moneyReturn = moneyReturn; 45 } 46 47 public override double AcceptCash(double money) 48 { 49 return money - (int)(money / this.moneyCondition) * this.moneyReturn; 50 } 51 } 52 53 54 55 }
在写负责创建对象和调用的CashCoxt类
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 策略模式 8 { 9 class CashContext 10 { 11 private CashSuper cs; 12 // 运用到了简单工厂,根据条件创建指定对象。可用发射优化。 13 public CashContext(string type) 14 { 15 switch (type) 16 { 17 case "不打折": cs = new CashNormal(); 18 break; 19 case "九折": cs = new CashRebate(0.9d); 20 break; 21 case "五折": cs = new CashRebate(0.5d); 22 break; 23 case "满300返100": cs = new CashReturn(300, 100); 24 break; 25 } 26 } 27 28 public double GetResult(double money) 29 { 30 return cs.AcceptCash(money); 31 } 32 33 } 34 }
最后调用的代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 策略模式 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 while (true) 14 { 15 Console.WriteLine("请输入金额:"); 16 double money = double.Parse(Console.ReadLine()); 17 Console.WriteLine("请选择打折方式:1.不打折 2.九折 3.五折 4.满300返100"); 18 int index = int.Parse(Console.ReadLine()) - 1; 19 string type = new String[] { "不打折", "九折", "五折", "满300返100" }[index]; 20 // 计算价格 21 Console.WriteLine("你需要付款:" + new CashContext(type).GetResult(money)); 22 Console.ReadKey(true); 23 } 24 25 26 27 } 28 } 29 }
我们客户端的代码只用到了CashContext类,降低了耦合。 而策略模式的精髓在于:完成同一个功能有不同的算法时,我们把他抽象到父类。然后每一个功能都由对应的子类来实现。 再用一个中间类为我们创建对象,调用方法。
这样的2点好处:
1、减少了各种算法类之间的耦合。
2、优化了单元测试。
策略模式就是用来封装算法的,当我们实践中某一个功能有多种实现的算法。我们就可以考虑使用策略模式。
标签:style blog http io ar color os 使用 sp
原文地址:http://www.cnblogs.com/simple-blog/p/4135657.html