3. Strategy(策略模式)C++
策略模式属于“组件协作”模式里的一种。
1. 动机
举个例子,我们假设一个场景,做一个税种的计算,一个跨国的税计算,除了涉及金额等,还需要考虑不同国家的纳税比例。
//第一种做法就是采用分而治之的方法,if-else语句或者是switch-case语句
enum TaxBase{
CN_Tax, //中国
US_Tax, //美国
DE_Tax //德国
};
class SalesOrder{
TaxBase tax;
public:
double CalculaterTax(){
//...
if(tax == CN_Tax){
//...
}else if(tax == US_Tax){
//...
}else if(tax == DE_Tax){
//..
}
//...
}
};
这个做法只要能解决问题,其实也无可厚非。不过,上面的条件判断语句,会有一个性能负担的情况,就是如果大多数情况下只计算德国的,那么 CalculaterTax() 的其他国家算法就都失效了,而且还要去对它继续判断。但从面向对象的角度,我们看代码,不要静态地看一个软件结构的设计,而是要动态地看,要有一个时间轴的概念,要考虑到未来的变化。就拿上面的例子来说,我们需要多考虑一下,有没有一种可能,未来会多增加日本、法国等替他国家税的计算呢。如果需要增加,上面的代码应该怎么变动呢。
//增加其他国家
enum TaxBase{
CN_Tax, //中国
US_Tax, //美国
DE_Tax, //德国
FR_Tax //变动,法国
};
class SalesOrder{
TaxBase tax;
public:
double CalculaterTax(){
//...
if(tax == CN_Tax){
//...
}else if(tax == US_Tax){
//...
}else if(tax == DE_Tax){
//..
}else if(tax == FR_Tax){
//变动</