意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
这个模式很好的诠释了开闭原则:对扩展开放,对修改封闭。
我们可能会遇到如下代码:
enum TexBase{
CN_Tex,
US_Tex,
DE_Tex
};
class SalesOrder
{
TexBase tax;
public:
double calculateTex()
{
if (tax == CN_Tex)
{
//...
}
else if (tax == US_Tex)
{
//...
}
else if (tax == DE_Tex)
{
//...
}
}
};
当我们想添加一个新的税率,就必须添加枚举值,然后去增加ifelse.这做的是修改。
更优雅的做法:
class TexStrategy
{
public:
virtual double Calculate(const Conext& context)=0;
virtual ~TexStrategy() {};
};
class CNTex :public TexStrategy
{
public:
virtual double Calculate(const Conext& context)
{
//...
}
};
class ENTex :public TexStrategy
{
public:
virtual double Calculate(const Conext& context)
{
//...
}
};
class DETex :public TexStrategy
{
public:
virtual double Calculate(const Conext& context)
{
//...
}
};
class Sales
{
private:
TexStrategy* strategy;
public:
Sales(StrategyFactory* strategyFactory)
{
this->strategy = strategyFactory->NewStrategy();
}
double calculateTex()
{
Context context;
return this->strategy->Calculate(context);
}
};
再想添加新的税率时就新增一个类,Sales类是不用改变的,