抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

组件协作:策略模式。

模式类型

组件协作

策略模式

软件构建过程中,某些对象使用的算法可能多种多样,经常改变。如何在运行时根据需要透明地改变对象的算法,将算法与对象本身解耦?

遵循开放封闭原则,开放扩展(类的增加),封闭修改(原对象的修改)。

定义一系列算法,把它们一个个封装起来,并使他们能够在运行时根据需要发生切换(变化),这个模式使得算法可以独立于使用它的客户程序而变化(扩展,子类化)。

接口保持稳定,其中的算法发生变化。

使用场景

含有许多 if-else 条件语句的代码通常可以使用策略模式。绝对稳定不变的 if-else 可以不用使用策略模式。

举例

未使用策略模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
enum TaxBase
{
CN_Tax,
US_Tax,
DE_Tax
};

class SalesOrder
{
double cal_tax()
{
if (CN_Tax) { // A
}
else if (US_Tax) { // B
}
else if (DE_Tax) { // C
}
}
};

使用策略模式

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
class TaxStrategy
{
virtual double cal_tax(const Context& context) = 0;
virtual ~TaxStrategy() {}
};

class CNTax : public TaxStrategy
{
virtual double cal_tax(const Context& context)
{
// A
}
};

class USTax : public TaxStrategy
{
...
};

class DETax : public TaxStrategy
{
...
};


class SalesOrder
{
TaxStrategy* strategy;

SalesOrder(StrategyFactory* strategyFactory)
{
// 工厂模式,是哪一个子类由工厂决定
this->strategy = strategyFactory->newStrategy();
}
~SalesOrder() { delete strategy; }

calculate_tax()
{
// ...
Context context();
// ...
double val = strategy->cal_tax(context);
// ...
}
};