模式定义:
定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立与使用它的客户程序(稳定)而变化(扩展,子类化)
例如我们要设计一个计算各个国家税费的程序:
enum TaxBase {
CN_Tax,
US_Tax,
GR_Tax
};
class SalesOrder
{
public:
double CalculateTax()
{
//...
if (tax == CN_Tax)
{
//CN.......
}
else if(tax == US_Tax)
{
//US.....
}
else if(tax == GR_Tax)
{
//GR.....
}
}
private:
TaxBase tax;
};
假设此时我们要添加一个计算法国税费的功能,那么需要在else if
分支上添加,此时就违反了开放封闭的原则(开放扩展)。
利用策略模式我们可以这样设计:
class TaxStrategy
{
public:
virtual double Calculate(const Context& context) = 0;
virtual ~TaxStrategy();
};
class CNTax:public TaxStrategy
{
public:
virtual double Calculate(const Context& context)
{
//CN.....
}
};
class USTax :public TaxStrategy
{
public:
virtual double Calculate(const Context& context)
{
//US.....
}
};
class GRTax :public TaxStrategy
{
public:
virtual double Calculate(const Context& context)
{
//GR.....
}
};
客户程序:
class SalesOrder
{
public:
SalesOrder()
{
this->strategy = strategyFactory->NewStrategy();//这里使用工厂模式实现
}
~SalesOrder()
{
delete this->strategy;
}
double CalculateTax()
{
//...
Context context();
double val = strategy->Calculate(context);
//...
}
private:
TaxStrategy * strategy;
};
此时我们如果还想添加功能的话,只需要新增加一个FR_Tax类继承自TaxStrategy类就可以了。很方便。
UML图: