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

 

posted @ 2020-08-16 12:34  xinpengc  阅读(133)  评论(0编辑  收藏  举报