首页 > 代码库 > 直截了当的告诉你什么是策略模式

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

策略模式的实现也是非常简单。还是那句话,直截了当,废话不多说。

模拟一个计算运费的程序

/// <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,
那怎么通过订单的配送方式创建不同的对象呢?下一节 抽象工厂 ,好了,就是这么直截了当。

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