計算器之策略

設計模式是面向對象的具體表現和實踐。或許哪天感覺面向對象理解差不多了,嘴裡也不用記掛著設計模式這個玩意兒,我只能通過反覆學習設計模式以加深理解面向對象。

下面複習策略模式,較常用,以計算器為例,寫起來就有感覺了。

第一步定義一下策略,

 public interface ICalculate 
    { 
        decimal Invoke(params decimal[] args); 
    }

 

第二步定義組裝程式碼,這裡封裝一下變化點,同時開放變化點。

 public class Calculator
    {
        private ICalculate _cal;
        public ICalculate Cal { get => _cal; set => _cal = value; }
        public decimal Invoke(params decimal[] args)
        {
            if (_cal == null)
                throw new ArgumentNullException("null instance");
            return _cal.Invoke(args);
        }
    }

 

第三步實現需要的演算法, 

 public class Add : ICalculate
    {
        public decimal Invoke(params decimal[] args)
        {
            return args.Aggregate((x, y) => x + y);
        }
    }
    public class Sub : ICalculate
    {
        public decimal Invoke(params decimal[] args)
        {
            return args.Aggregate((x, y) => x - y);
        }
    }

    public class Dev : ICalculate
    {
        public decimal Invoke(params decimal[] args)
        {
            return args.Aggregate((x, y) => x / y);
        }
    }

    public class Mul : ICalculate
    {
        public decimal Invoke(params decimal[] args)
        {
            return args.Aggregate((x, y) => x * y);
        }
    }

 

 

下面就是客戶端實現了

        Calculator calculator = new Calculator();
            calculator.Cal = new Add();
            Trace.WriteLine(calculator.Invoke(1, 2, 5, 6));
            calculator.Cal = new Sub();
            Trace.WriteLine(calculator.Invoke(10, 3, 1));
            calculator.Cal = new Dev();
            Trace.WriteLine(calculator.Invoke(100, 5, 10));
            calculator.Cal = new Mul();
            Trace.WriteLine(calculator.Invoke(1, 2, 3, 4, 5, 6, 7, 8, 9));

 

總結: 這程式碼應該非常簡單和簡潔,不說面向對象設計原則什麼的,這裡就是靈活運用介面和組合吧,介面就是其中一種抽象行為的體現,到應用層面再去替換具體的實現類,工廠同樣的效果。 

Tags: