策略模式的实现也是非常简单。还是那句话,直截了当,废话不多说。
模拟一个计算运费的程序
/// <summary> /// 配送方式 /// </summary> public enum ShippingOptions { EMS = 0, 顺丰 = 1, 圆通 = 2, 中通 = 4, 天天 = 8, 宅急送 = 16 }
public class Order { public int Id { get; set; } public ShippingOptions ShippingMethod { get; set; } }
public class ShippingCostCalculatorService { /// <summary> /// 计算运费 /// </summary> /// <param name="order">订单</param> /// <returns></returns> public double CalculateShippingCost(Order order) { switch (order.ShippingMethod) { case ShippingOptions.EMS: return 15.00d; case ShippingOptions.顺丰: return 10.00d; case ShippingOptions.圆通: return 3.00d; case ShippingOptions.中通: return 1.00d; case ShippingOptions.天天: return 8.00d; case ShippingOptions.宅急送: return 5.00d; default: throw new Exception("Unknown carrier"); } } }
上面代码有什么问题?未来可能会推出新的配送方式,这也完全合理,我们必须手动修改swich语句,我们程序里不光这一个地方写了switch,这样的话就会出问题
解决办法:
public interface IShippingStrategy { double Calculate(Order order); }
/// <summary> /// 顺丰 /// </summary> public class SF : IShippingStrategy { public double Calculate(Order order) { return 10.00d; } } /// <summary> /// 中通 /// </summary> public class ZTO : IShippingStrategy { public double Calculate(Order order) { return 1.00d; } }还有其他方式我就不写了
public class ShippingCostCalculatorService { private readonly IShippingStrategy _shippingStrategy; public ShippingCostCalculatorService(IShippingStrategy shippingStrategy) { _shippingStrategy = shippingStrategy; } /// <summary> /// 计算运费 /// </summary> /// <param name="order">订单</param> /// <returns></returns> public double CalculateShippingCost(Order order) { return _shippingStrategy.Calculate(order); } }
看到这里大家应该清楚Calculate方法是通过接口在调用,那么_shippingStrategy这个接口变量里面装的到底是哪个对象?
是由订单Order的配送方式决定的。
如果配送方式是顺丰,接口变量里面应该装的就是SF,
如果配送方式是中通,那么接口变量里面装的就是ZTO,
那怎么通过订单的配送方式创建不同的对象呢?下一节 抽象工厂 ,好了,就是这么直截了当。
时间: 2024-10-13 07:35:18