设计模式中的复用性指的是编译单位(二进制层面)的复用性(编译、测试、部署后是原封不动的)
红色圈出的为稳定的部分,蓝色圈出的是不稳定的部分。
红色:如示例代码中的中国、美国、德国
蓝色:如示例代码中的基类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); //多态调用
- //...
- }
- };