设计模式中的复用性指的是编译单位(二进制层面)的复用性(编译、测试、部署后是原封不动的)
红色圈出的为稳定的部分,蓝色圈出的是不稳定的部分。
红色:如示例代码中的中国、美国、德国
蓝色:如示例代码中的基类TaxStrategy和使用它的类型SalesOrder
代码具有良好的本地性,降低了性能负担(需要哪个加载哪个,不需要加载一大段代码)
enum TaxBase
{CN_Tax,US_Tax,DE_Tax,FR_Tax //更改
};class SalesOrder
{TaxBase tax;public:double CalculateTax(){//...//if else 结构化时代分而治之的设计思维//代码中出现大段if else,往往是策略模式需要的特征if (tax == CN_Tax){//CN***********}else if (tax == US_Tax){//US***********}else if (tax == DE_Tax){//DE***********}else if (tax == FR_Tax){ //更改//...}//....}
};
class Context;class TaxStrategy //算法策略基类
{
public:virtual double Calculate(const Context &context) = 0;virtual ~TaxStrategy() {}
};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); //多态调用//...}
};