模式特点
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式使算法可独立于使用它的客户端而变化。
- 将算法族封装为独立的策略类
- 运行时可以动态切换算法
- 消除大量的条件判断语句
- 新增算法只需新增策略类,符合开闭原则
类图
应用场景
- Qt 中 QStyle:不同平台使用不同的绘制策略
- 机器人运动规划:关节运动/直线运动/圆弧运动策略切换
- 排序算法选择:根据数据量选择快排/归并/插入排序
- 压缩策略:ZIP / GZIP / LZ4 按需切换
- 通信协议选择:TCP / UDP / WebSocket 不同场景切换
示例代码(C++)
// 策略接口 - 运动规划 class MotionStrategy { public: virtual void move(double x, double y, double z) = 0; virtual ~MotionStrategy() = default; }; // 关节运动 class JointMove : public MotionStrategy { public: void move(double x, double y, double z) override { std::cout << "关节运动到(" << x << "," << y << "," << z << ")" << std::endl; }}; // 直线运动 class LinearMove : public MotionStrategy { public: void move(double x, double y, double z) override { std::cout << "直线运动到(" << x << "," << y << "," << z << ")" << std::endl; }}; // 圆弧运动 class CircularMove : public MotionStrategy { public: void move(double x, double y, double z) override { std::cout << "圆弧运动到(" << x << "," << y << "," << z << ")" << std::endl; }}; // 上下文 class Robot { MotionStrategy* m_strategy; public: void setStrategy(MotionStrategy* s) { m_strategy = s; } void moveTo(double x, double y, double z) { m_strategy->move(x, y, z); } }; Robot robot; robot.setStrategy(new JointMove()); robot.moveTo(100, 200, 50); robot.setStrategy(new LinearMove()); robot.moveTo(100, 200, 50); // 运行时切换