您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页第11天:用策略模式代替switch

第11天:用策略模式代替switch

来源:五一七教育网

今天的重构很有意思,旧的代码是根据参数State来调用三个不同的方法,获取三个地方的装运量

代码如下:

Code
 public class ClientCode
    {
        public decimal CalculateShipping()
        {
            ShippingInfo shippingInfo = new ShippingInfo();
            return shippingInfo.CalculateShippingAmount(State.Alaska);
        }
    }
    public enum State
    {
        Alaska,
        NewYork,
        Florida
    }
    public class ShippingInfo
    {
        public decimal CalculateShippingAmount(State shipToState)
        {
            switch (shipToState)
            {
                case State.Alaska:
                    return GetAlaskaShippingAmount();
                case State.NewYork:
                    return GetNewYorkShippingAmount();
                case State.Florida:
                    return GetFloridaShippingAmount();
                default:
                    return 0m;
            }
        }
        private decimal GetAlaskaShippingAmount()
        {
            return 15m;
        }
        private decimal GetNewYorkShippingAmount()
        {
            return 10m;
        }
        private decimal GetFloridaShippingAmount()
        {
            return 3m;
        }
    }

 

 

如果我们现在要加一个Chicago的条件,那么不得不修改整个ShippingInfo

重构后用策略模式,对每一个条件加一个类,并且实现同一个接口,以后如果希望添加新的条件,只需添加新的实现类就可以了,实现对修改关闭,对扩展开放

重构后的代码如下

Code
public class ClientCode
    {
        public decimal CalculateShipping()
        {
            ShippingInfo shippingInfo = new ShippingInfo();
            return shippingInfo.CalculateShippingAmount(State.Alaska);
        }
    }
    public enum State
    {
        Alaska,
        NewYork,
        Florida
    }
    public class ShippingInfo
    {
        private IDictionary<State, IShippingCalculation> ShippingCalculations
        { get; set; }
        public ShippingInfo()
        {
            ShippingCalculations = new Dictionary<State, IShippingCalculation>{
                                        { State.Alaska, new AlaskShippingCalculation() },
                                        { State.NewYork, new NewYorkShippingCalculation() },
                                        { State.Florida, new FloridaShippingCalculation() }};
        }
        public decimal CalculateShippingAmount(State shipToState)
        {
            return ShippingCalculations[shipToState].Calculate();
        }
    }


    public interface IShippingCalculation
    {
        decimal Calculate();
    }
    public class AlaskShippingCalculation : IShippingCalculation
    {
        public decimal Calculate()
        {
            return 15m;
        }
    }
    public class NewYorkShippingCalculation : IShippingCalculation
    {
        public decimal Calculate()
        {
            return 10m;
        }
    }
    public class FloridaShippingCalculation : IShippingCalculation
    {
        public decimal Calculate()
        {
            return 3m;
        }
    }

 

 

故事还没完,书的作者又进行了如下的重构,今天没有弄明白,先记录下来

Code
 public interface IShippingInfo
    {
        decimal CalculateShippingAmount(State state);
    }
    public class ClientCode
    {
        [Inject]
        public IShippingInfo ShippingInfo { get; set; }
        public decimal CalculateShipping()
        {
            return ShippingInfo.CalculateShippingAmount(State.Alaska);
        }
    }
    public enum State
    {
        Alaska,
        NewYork,
        Florida
    }
    public class ShippingInfo : IShippingInfo
    {
        private IDictionary<State, IShippingCalculation> ShippingCalculations
        { get; set; }

        public ShippingInfo(IEnumerable<IShippingCalculation> shippingCalculations)
        {
            ShippingCalculations = shippingCalculations.ToDictionary(
            calc => calc.State);
        }
        public decimal CalculateShippingAmount(State shipToState)
        {
            return ShippingCalculations[shipToState].Calculate();
        }
    }
    public interface IShippingCalculation
    {
        State State { get; }
        decimal Calculate();
    }


    public class AlaskShippingCalculation : IShippingCalculation
    {
        public State State { get { return State.Alaska; } }
        public decimal Calculate()
        {
            return 15m;
        }
    }
    public class NewYorkShippingCalculation : IShippingCalculation
    {
        public State State { get { return State.NewYork; } }
        public decimal Calculate()
        {
            return 10m;
        }
    }
    public class FloridaShippingCalculation : IShippingCalculation
    {
        public State State { get { return State.Florida; } }
        public decimal Calculate()
        {
            return 3m;
        }
    }

转载于:https://www.cnblogs.com/ysuhy/archive/2010/01/04/1639123.html

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务