设计模式(三)strategy

来源:互联网 发布:单片机红绿灯电路图 编辑:程序博客网 时间:2024/06/07 07:24

1.使用场景:某些对象使用的算法可能多种多样,经常改变,将算法与对象本身解耦。

2.理论依据:虚函数、多态

3.定义:定义一系列算法,把他们一个个封装起来,并且使它们可互相
替换(变化),该模式使得算法可独立于使用他的客户程序(稳定)而变化(拓展,子类化)

4.步骤:定义算法基类(含纯虚函数的算法函数),利用多态调用基类的派生类算法


5.技法:紧耦合->松耦合

6.变化:运行时调用的函数
不变:调用的算法基类
 

原代码:

enum TaxBase {CN_Tax,US_Tax,DE_Tax,FR_Tax       //更改};class SalesOrder{    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){  //更改//...}        //....     }    };

strategy设计模式代码:

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); //多态调用        //...    }    };

结构: