//税务计算
enum TaxBase{
US_Tax,
CN_Tax,
DE_Tax,
JAP_Tax //更改 新增
};
class strage{
TaxBase tax;
public:
double calculate_tax(){
if(tax == US_Tax){
//......
}else if(tax == CN_Tax){
//......
}else if(tax == DE_Tax){
//......
}else if(tax == JAP_Tax){
//新增....
}
}
};
//上面的代码在新增了业务类型时,改变了原有的代码,违背了开放封闭原则
////////////////////////////////////////////////////////
//////////////策略模式/////////////////////////////////
class TaxStrategy{
public:
virtual double calculate_tax(context& context) = 0;
virtual~ TaxStrategy(){}
};
class CNTax : public TaxStrategy{
public:
virtual double calculate_tax(context& context){
//...........
}
};
class US_Tax : public TaxStrategy{
public:
virtual double calculate_tax(context& context){
//...........
}
};
class DE_Tax : public TaxStrategy{
public:
virtual double calculate_tax(context& context){
//...........
}
};
//新增了一个算法,只需要添加一个class 扩展
class JAP_Tax : public TaxStrategy{
public:
virtual double calculate_tax(context& context){
//...........
}
};
// salesorder是稳定的,但具体税务计算算法是变化的,通过新增新的文件class来实现
class salesorder{
private:
TaxStrategy* taxStrategy;
public:
salesorder(StragetyFactory* stragetyFactory){
this->taxStrategy = stragetyFactory->newTaxStrategy();
}
virtual ~salesorder(){
delete this->taxStrategy;
}
public:
double calculate_tax(){
//....
Context context();
double val = taxStrategy->calculate_tax(context);//多态调用
//.,,.,,,
return val;
}
};