十分钟学会一个设计模式---行为模式---策略模式(Strategy Pattern)

171 阅读1分钟

一、应用场景

避免使用过多的if-else进行判断,来决定执行哪个算法,将算法封装成一个个的类

二、反例代码

class Obj{
private:
    string m_strategy;
public:
    explicit Obj(string strategy) : m_strategy(strategy){};
    void process() {
        if (m_strategy == "add") {
            // todo add
        } else if (m_strategy == "sub") {
            // todo sub
        } else if (m_strategy == "multi") {
            // todo multi
        } else {
            // todo other
        }
    }
};

三、正例代码

class Strategy{
public:
    virtual void process() = 0;
    virtual ~Strategy()= default;
};

class AddStrategy : public Strategy{
    void process() override {
        // todo
    }
};

class SubStrategy : public Strategy{
    void process() override {
        // todo
    }
};

class Obj{
private:
    Strategy* m_strategy;
public:
    explicit Obj(Strategy* strategy): m_strategy(strategy){};
    void process() {
        m_strategy->process();
    }
};

四、优点

1、避免使用多重条件判断

2、符合开闭原则,扩展性好

五、缺点

1、策略类会增多

2、所有策略类都需要对外暴露