行为模式4-策略模式
策略模式Strategy
意图
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式是的算法可独立于使用它的客户而变化。
问题思考
考虑跨平台文本编辑器。windows下换行是\r\n,unix是\n。这只是格式化算法的一部分。如果直接把格式化硬编码到程序中(if else),将使程序变得更加复杂。比如,我们想增加\r这种换行的时候。
适用性
- 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
- 需要使用一个算法的不同变体。例如:权衡时间/空间的算法,一个侧重时间,一个侧重空间。
- 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。
类图
strategy实现
class Strategy {
public:
virtual void AlgorithmInterface() = 0;
};
class Context {
public:
explicit Context(Strategy *strategy) { mStrategy = strategy; }
void ContextInterface() {
mStrategy->AlgorithmInterface();
}
private:
Strategy *mStrategy = nullptr;
};
class ConcreteStrategy1 : public Strategy {
public:
void AlgorithmInterface() override {
std::cout << "format 1" << std::endl;
// some other thing
}
};
class ConcreteStrategy2 : public Strategy {
public:
void AlgorithmInterface() override {
std::cout << "format 2" << std::endl;
// some other thing
}
};
注意:接口应该根据需求而改变。比如需不需要知道Context的信息。如果需要知道context的信息,ConcreteStrategy就需要一个Context成员变量。
网友评论