策略模式

  • 策略模式

    • 解决某些对象使用多种算法。将算法与对象本身节藕,从而实现透明的更改对象的算法
  • 模式定义

    定义一系列算法,把他们一个个封装起来,并且使他们可互相替换 (变化) 。改模式使得算法可以独立于使用他的客户程序 (稳定) 而变化 (扩展,子类话)

策略模式

例子

  • 违背开闭原则,需要重新修改
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    enum TaxBase{
    CN_Tax,
    US_Tax,
    DE_Tax,
    FR_tax//更改
    };

    class SalesOrder{
    TaxBase tax;
    public:
    double CalculateTax(){
    if (tax == CN_Tax){

    }else if(tax == US_Tax){

    }else if(tax == DE_Tax){

    }else if(tax == FR_Tax){//更改

    }
    }
    }

改进

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class TaxStrategy{
public:
virtual double Calculate(const Context& context)=0
virtual ~TaxStrategy(){}

};

class CNTax:public TaxStrategy{
public:
virtual double Calculate(const Context& context){

}
}

class USTax:public TaxStrategy{
public:
virtual double Calculate(const Context& context){

}
}

class DETax:public TaxStrategy{
public:
virtual double Calculate(const Context& context){

}
}

//新增
class FR_Tax:public TaxStrategy{
public:
virtual double Calculate(const Context& context){

}
}


class SalesOrder{
private:
TaxStrtegy* strategy;
public:
SalesOrder(StrategyFactory* strategyFactory){
this->strategy = strategyFactory->NewStrategy();
}
~SalesOrder(){
delete this->strategy;
}

public double CalculateTax(){
//....
Context context;
double val = this->strategy->Calculate(context);
}
};

复用性

主要指二进制层面的复用性

模式定义

定义一系列算法,把他们一个个封装起来,并且使他们可互相替换 (变化) 。改模式使得算法可以独立于使用他的客户程序 (稳定) 而变化 (扩展,子类话)

UML图

策略模式UML图

要点总结

Strategy及其子类为组件提供了一系列可重用的算法

  • 从而可以使得类型在运行时方便的根据需要在 $\underline{运行时}$ 方便的根据需要切换

    Strategy 提供了用条件语句之外的另一种选择,消除条件判断语句

  • 就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式

    如果Strategy 对象没有实例变量,那么上下文可以共享一个Strategy对象

  • 从而节省开销
  • 使用单例模式