设计模式-策略模式
应用场景
在写程序时,经常会出现if和switch语句加入新的条件,并且这么新条件以后还有可能增加,那么可以考虑使用策略模式。
类图
举例
一般写法
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){
//US...
}
else if (tax == DE_Tax){
//DE...
}
else if (tax == FR_Tax){
//...
}
//....
}
};
策略模式
class TaxStrategy{
public:
virtual double Calculate(const Context& context)=0;
virtual ~TaxStrategy(){}
};
//=================这里的方法代替if判断,有新情况直接在这里写=====================
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 FRTax : public TaxStrategy{
public:
virtual double Calculate(const Context& context){
//.........
}
};
//===================================================
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);
//...
}
};
优点
1、代替if、switch语句;
2、代码优雅、可复用、可读性好;
3、符合开闭原则,扩展性好、便于维护;
4、只需编译新加入的策略;
缺点
1、策略如果很多的话,会造成策略类膨胀;
2、使用者必须清楚所有的策略类及其用途;