定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。 ——《设计模式》 GoF
当需要加上需求FR_Tax,需要再加上代码else if,这样违背了一个原则——开放封闭原则(OCP)(①对扩展开放,对更改封闭。②类模块应该是可扩展的,但是不可修改。尽可能用扩展的方式来应对变化,而不是用修改源代码的方式应对变化) 以下代码的修改:将原来一个一个的算法,变为现在TaxStrategy的子类
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); //多态调用 //... } };好处:放在时间轴上来看,假设出现了一种变化,需要支持法国的业务FR_Tax ,需要加一个class FRTax : public TaxStrategy{},然而SalesOrder这个类在整个过程中根本不需要改变,即得到了复用性。