一、经典案例
设计一个商店收银系统。完成最基本的商品买卖收费统计问题。能解决各个商品正常情况下的收费处理\打折情况下的收费处理\返利情况下的收费处理。
图 UML图
抽象策略基类
- namespace StrategyPattern
- {
- /* 注意抽象类的写法 */
- abstract class Strategy
- {
- abstract public void ArithmeticInterface();
- }
- }
三个派生类,继承相同的公共方法进行不同的实现。
- namespace StrategyPattern
- {
- class ConcreteStrategyA : Strategy
- {
- public override void ArithmeticInterface()
- {
- Console.WriteLine("Operate in ConcreteStategyA");
- //throw new NotImplementedException();
- }
- }
- }
- namespace StrategyPattern
- {
- class ConcreteStrategyB : Strategy
- {
- public override void ArithmeticInterface()
- {
- Console.WriteLine("Operate in ConcreteStrategyB");
- //throw new NotImplementedException();
- }
- }
- }
- namespace StrategyPattern
- {
- class ConcreteStrategyC : Strategy
- {
- public override void ArithmeticInterface()
- {
- Console.WriteLine("Operate in ConcreteStrategyC");
- //throw new NotImplementedException();
- }
- }
- }
关键步骤,通过策略上下文类来调用各个派生类的实例!- namespace StrategyPattern
- {
- class StrategyContext
- {
- public Strategy strategy;
- public StrategyContext(Strategy strategy)
- {
- this.strategy = strategy;
- }
- public void Invoke()
- {
- this.strategy.ArithmeticInterface();
- }
- }
- }
- namespace StrategyPattern
- {
- class Program
- {
- static void Main(string[] args)
- {
- StrategyContext strategyContext;
- strategyContext = new StrategyContext(new ConcreteStrategyA());
- strategyContext.Invoke();
- strategyContext = new StrategyContext(new ConcreteStrategyB());
- strategyContext.Invoke();
- strategyContext = new StrategyContext(new ConcreteStrategyC());
- strategyContext.Invoke();
- Console.ReadLine();
- }
- }
- }
StrategyPattern.zip
策略模式原始案例.zip
二、策略模式的理论引出
1、策略模式的概念
策略模式是一种定义一系列算法的的方法,这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了了各种算法类与使用算法类之间的耦合。
2、策略模式的优点
上面案例中,策略模式的Strategy类层次为StrategyContext定义了一系列的可供重用的算法或行为。继承有助于取出这些算法的中的公共功能。
另外,策略模式简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
算法类间相对独立,修改其中任一个不会影响其他的算法。
3、策略模式的用途
策略模式就是用来封闭算法的,在实践中可以用它来封装几乎任何类型的的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可考虑使用策略模式处理这种变化的可能性。
三、参考文献
《大话设计模式》.程杰著
阅读(2326) | 评论(0) | 转发(0) |