设计模式学习之策略模式

0 阅读1分钟
#include <iostream>

class CalculateBehavior{
public:
        virtual double calculate(double a,double b) = 0;
};

class AddCalculate : public CalculateBehavior{
public:
        double calculate(double a,double b) override{
                return a + b;
        }
};

class SubtractionCalculate : public CalculateBehavior{
public:
        double calculate(double a,double b) override{
                return a - b;
        }
};

class Calculate{
public:
        Calculate(double a,double b,CalculateBehavior * calculateBehavior) : _a(a),_b(b) ,_calculateBehavior(calculateBehavior){}

        double retCalculateValue(){
                return _calculateBehavior->calculate(_a,_b);
        }

        void setCalculateBehavior(CalculateBehavior * calculateBehavior){
                _calculateBehavior = calculateBehavior;
        }
private:
        double _a;
        double _b;
        CalculateBehavior * _calculateBehavior = nullptr;
};


int main(int argc,char * argv[]){

        SubtractionCalculate subtractionCalculate;
        AddCalculate addCalculate;

        auto c = Calculate(7,9,&subtractionCalculate);

        std::cout << "[1] " << c.retCalculateValue() << std::endl;

        c.setCalculateBehavior(&addCalculate);

        std::cout << "[2] " << c.retCalculateValue() << std::endl;

        return 0;
}

策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。

策略模式总共由三部分组成,分别是:

  1. 持有行为的对象。对应到我们上面的代码中就是 CalculateBehavior * _calculateBehavior = nullptr;
  2. 策略接口。声明了所有支持的算法的公共接口,对应到代码中的CalculateBehavior
  3. 具体策略。每个具体策略都实现了策略接口所定义的行为。