計算器之策略
設計模式是面向對象的具體表現和實踐。或許哪天感覺面向對象理解差不多了,嘴裡也不用記掛著設計模式這個玩意兒,我只能通過反覆學習設計模式以加深理解面向對象。
下面複習策略模式,較常用,以計算器為例,寫起來就有感覺了。
第一步定義一下策略,
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));
總結: 這程式碼應該非常簡單和簡潔,不說面向對象設計原則什麼的,這裡就是靈活運用介面和組合吧,介面就是其中一種抽象行為的體現,到應用層面再去替換具體的實現類,工廠同樣的效果。