首页 > 代码库 > 直截了当的告诉你什么是策略模式
直截了当的告诉你什么是策略模式
策略模式的实现也是非常简单。还是那句话,直截了当,废话不多说。
模拟一个计算运费的程序
/// <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,
那怎么通过订单的配送方式创建不同的对象呢?下一节 抽象工厂 ,好了,就是这么直截了当。
直截了当的告诉你什么是策略模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。