一、Strategy
在软件构建过程中,某些对象使用的算法可能
多种多样
,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂
;而且有时候支持不使用的算法也是一个性能负担
;
- Strategy及其子类为组件提供了一系列
可重用
的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换
;- 提供了用
条件判断语句
以外的另一种选择,消除条件判断
语句,就是在解耦合
。含有许多条件判断语句的代码通常都需要Strategy模式;
1、优点
如果Strategy对象
没有实例变量
,那么各个上下文可以共享同一个Strategy对象
,从而节省开销
;
2、适用场景
- 许多相关类仅在
行为
上有所不同;- 您需要算法的
不同变体
;- 算法使用客户
不应该知道的数据
;- 需要多种条件判段语句;
3、模板示例
/** 基类 */
class TaxStrategy{
public:
virtual double Calculate(const Context& context)=0;
virtual ~TaxStrategy(){}
};
class CNTax : public TaxStrategy{
public:
double Calculate(const Context& context) override {}
};
class USTax : public TaxStrategy{
public:
double Calculate(const Context& context) override {}
};
class DETax : public TaxStrategy{
public:
double Calculate(const Context& context) override {}
};
//扩展
class FRTax : public TaxStrategy{
public:
double Calculate(const Context& context) override {}
};
/** 使用 */
class SalesOrder{
private:
TaxStrategy* strategy;
public:
SalesOrder(StrategyFactory* strategyFactory){
this->strategy = strategyFactory->NewStrategy();
}
~SalesOrder(){
delete this->strategy;
}
public double CalculateTax(){
Context context();
double val = strategy->Calculate(context); //多态调用
}
};