背景:当需要完成某一个功能时,在不同的条件下,会有不同的实现方法。比如要计算税率,不同国家有不同的计算方法。
如果将这些不同的实现都放在一个类中:
一是造成代码复杂,难以维护。
二是如果添加新条件下的不同实现方法,需要重新修改源代码,可能造成意料之外的问题,并且难度会很大。同时也不符合开闭原则:对拓展开放,对修改关闭。
三是这个类的不同对象在使用时,可能只会使用到其中一种方法,导致时间复杂度变高,因为需要在所有方法中去找到适合的方法。
解决办法:将这些方法剥离出来,使用一个类作为所有方法的基类,不同方法作为子类去继承这个基类,由每个子类分别实现一种方法,这个类称之为策略。满足了开闭原则。 当需要有新的实现方法时,只用再添加一个策略类即可。
实例
#include <iostream>
using namespace std;
class BaseStrategy{
public:
virtual void caculate() = 0;
virtual ~BaseStrategy(){}
};
class StrategyA: public BaseStrategy{
public:
virtual void caculate(){
cout << "用策略A计算" << endl;
}
};
class StrategyB: public BaseStrategy{
public:
virtual void caculate(){
cout << "用策略B计算" << endl;
}
};
// 使用组合的方式,类中有一个策略的对象。
// 由对象决定使用哪种策略
class Context{
private:
BaseStrategy *strategy;
public:
Context(BaseStrategy *strategy){
this->strategy = strategy;
}
void solve(){
strategy->caculate();
}
~Context(){
if(strategy)
delete strategy;
}
};
int main(void)
{
// 产生不同的策略对象
BaseStrategy *strategyA = new StrategyA();
BaseStrategy *strategyB = new StrategyB();
// 创建对象,面对不同条件,选择不同的策略
Context *contextA = new Context(strategyA);
Context *contextB = new Context(strategyB);
// 产生不同的效果
contextA->solve();
contextB->solve();
return 0;
}
结果