技巧:如果代码中使用到if else 语句的时候就可以使用策略模式,但不是说都适合策略模式,如果条件的个数是固定的,比如说一周有七天,每一天执行不同的操作,就不需要使用策略模式。如果条件的个数是不一定的或者说后面需要添加的,这种情况下就可以考虑使用策略模式。
优点:1.当if else很多的时候,使用策略模式可以使得代码执行的效率提高。if else 其实只有一种情况被执行,其他的代码其实都是没有用到的。
2.可以动态的去添加新的功能 ,而不需要修改代码
案例:不同国家的税法不同的计算方式
第一种方式
这种方式情况下,如果我们要新增一个国家的税法的计算。那么就不符合开闭原则,需要修改源代码。
enum TaxBase{
CN_Tax,
US_Tax,
DE_Tax
};
class SalesOrder{
TaxBase tax;
public :
double CalcTax(){
if(tax == CN_Tax){
qDebug() << "计算中国税" <<endl;
}else if(tax == US_Tax){
qDebug() << "计算美国税" <<endl;
}else if(tax == DE_Tax){
qDebug() << "计算德国税" <<endl;
}
}
};
第二种使用Strategy
class StrategyTax
{
public:
virtual double CalcTax() = 0;
virtual ~StrategyTax(){}
};
class CNTax :public StrategyTax{
virtual double CalcTax( ) {
qDebug() << "计算中国税" <<endl;
}
};
class USTax :public StrategyTax{
virtual double CalcTax( ) {
qDebug() << "计算美国税" <<endl;
}
};
class DETax :public StrategyTax{
virtual double CalcTax( ) {
qDebug() << "计算德国税" <<endl;
}
};
class StrategySalesOrder{
private:
StrategyTax* Strategy;
public :
StrategySalesOrder(StrategyTax* itax){
Strategy = itax;
}
double CalcTax(){
return Strategy->CalcTax();
}
};