计算器之策略
设计模式是面向对象的具体表现和实践。或许哪天感觉面向对象理解差不多了,嘴里也不用记挂着设计模式这个玩意儿,我只能通过反复学习设计模式以加深理解面向对象。
下面复习策略模式,较常用,以计算器为例,写起来就有感觉了。
第一步定义一下策略,
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));
总结: 这代码应该非常简单和简洁,不说面向对象设计原则什么的,这里就是灵活运用接口和组合吧,接口就是其中一种抽象行为的体现,到应用层面再去替换具体的实现类,工厂同样的效果。