一、应用场景
避免使用过多的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、所有策略类都需要对外暴露