Design Patterns 4 - 策略模式 Strategy
https://www.bilibili.com/video/BV1kW411P7KS?p=4
//strategy1.cpp //变化:增加对法国的支持,违背开闭原则:对扩展开放,对更改封闭 enum TaxBase { CN_Tax, US_Tax, DE_Tax, FR_Tax //更改 }; class SalseOrder{ TaxBase tax; public: double CalculateTax(){ //... if (tax == CN_Tax){ //一个个的算法 //CN********** } else if (tax == US_Tax){ //US*********** } else if (tax == DE_Tax){ //DE*********** } else if (tax == FR_Tax){ //更改 //FR*********** } //.... } };
//strategy2.cp //工程上,每个类单独放一个文件 class TaxStrategy{ public: virtual double Caculate(const Context &context) = 0; virtual ~TaxStrategy(){} }; //把一个个的算法,变成了一个个子类 class CNTax : public TaxStrategy{ public: virtual double Caculate(const Context &context){ //************* } }; class USTax : public TaxStrategy{ public: virtual double Caculate(const Context &context){ //************* } }; class DETax : public TaxStrategy{ public: virtual double Caculate(const Context &context){ //************* } }; //增加对法国的支持,增加一个子类,SalesOrder没有任何改变,复用性强 //开放封闭原则 class FRTax : public TaxStrategy{ public: virtual double Caculate(const Context &context){ //.... } }; class SalesOrder{ private: TaxStrategy *strategy; //指针为变化带来了可能 public: SalesOrder(StrategyFactory * strategyFactory){ this->strategy = strategyFactory->NewStrategy(); } ~SalesOrder(){} double CalculateTax(){ //... Context context(); double val = strategy->Calculate(context); //多态调用 //... } };
Marty