Skip to content

Latest commit

 

History

History
111 lines (89 loc) · 2.17 KB

02.策略模式.md

File metadata and controls

111 lines (89 loc) · 2.17 KB

策略模式 Strategy

  • 提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合

动机

软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时支持不使用的算法也是一个性能负担

模式定义

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

代码

原始设计

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){ // 更改
            //FR...
        }

        //...
    }
};

重构设计

class TaxStrategy{
public:
    virtual double Calculate(const Contex& context) = 0;
    virtual ~TaxStrategy(){}
};

class CNTax : public TaxStrategy{
public:
    double Calculate(const Contex& context) override{
        //...
    }
};

class US_Tax : public TaxStrategy{
public:
    double Calculate(const Contex& context) override{
        //...
    }
};

class DE_Tax : public TaxStrategy{
public:
    double Calculate(const Contex& context) override{
        //...
    }
};

// 扩展
class FR_Tax : public TaxStrategy{
public:
    double Calculate(const Contex& context) override{
        //...
    }
};


class SalesOrder{
private:
    TaxStrategy* strategy;
public:
    SalesOrder(StrategyFactory* strategyFactory){
        this->strategy = strategyFactory->NewStrategy();
    }
    ~SalesOrder(){
        delete this->strategy;
    }

    double CalculateTax(){
        //...
        Context context();

        double val = strategy->Calculate(context);  // 多态调用

        //...
    }
};

题目