使用场景
- 主要目的是定义一系列可互换的算法或行为,并使它们在运行时可以根据不同的情况动态地替换。
- 它侧重于算法的封装和替换,让客户端可以灵活地选择不同的策略来完成特定的任务。
- 例如,在一个游戏角色的行为系统中,角色的攻击行为可能有多种策略,如近战攻击、远程攻击等,策略模式可以让游戏根据角色的装备或者玩家的操作来动态选择攻击策略
- 适用于有多种算法或行为可以完成同一项任务,并且这些算法或行为在运行时可能需要频繁切换的情况。比如,在一个导航软件中,路径规划可以有多种策略,如最短路径、最快路径、避开拥堵路径等,用户可以根据自己的需求在不同的策略之间切换
为什么用
- 同一个功能,多个版本实现
- 成员函数每一个都是独立的功能,互相无耦合,甚至可以相互组合,策略模式而非工厂模式
example
class ShapeDrawingStrategy {
public:
virtual void draw() = 0;
};
class CircleDrawingStrategy : public ShapeDrawingStrategy {
public:
void draw() override {
std::cout << "Drawing a circle." << std::endl;
}
};
class RectangleDrawingStrategy : public ShapeDrawingStrategy {
public:
void draw() override {
std::cout << "Drawing a rectangle." << std::endl;
}
};
class ShapeDrawer {
private:
ShapeDrawingStrategy* strategy;
public:
ShapeDrawer(ShapeDrawingStrategy* s) : strategy(s) {}
void drawShape() {
strategy->draw();
}
};
int main() {
ShapeDrawer drawer(new CircleDrawingStrategy());
drawer.drawShape();
drawer = ShapeDrawer(new RectangleDrawingStrategy());
drawer.drawShape();
return 0;
}