您的位置:首页 > 其它

直截了当的告诉你什么是策略模式

2017-07-15 22:59 274 查看
策略模式的实现也是非常简单。还是那句话,直截了当,废话不多说。

模拟一个计算运费的程序

/// <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,
那怎么通过订单的配送方式创建不同的对象呢?下一节 抽象工厂 ,好了,就是这么直截了当。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: