【C++】策略模式

使用场景

  1. 主要目的是定义一系列可互换的算法或行为,并使它们在运行时可以根据不同的情况动态地替换。
  2. 它侧重于算法的封装和替换,让客户端可以灵活地选择不同的策略来完成特定的任务。
    1. 例如,在一个游戏角色的行为系统中,角色的攻击行为可能有多种策略,如近战攻击、远程攻击等,策略模式可以让游戏根据角色的装备或者玩家的操作来动态选择攻击策略
  3. 适用于有多种算法或行为可以完成同一项任务,并且这些算法或行为在运行时可能需要频繁切换的情况。比如,在一个导航软件中,路径规划可以有多种策略,如最短路径、最快路径、避开拥堵路径等,用户可以根据自己的需求在不同的策略之间切换

为什么用

  1. 同一个功能,多个版本实现
  2. 成员函数每一个都是独立的功能,互相无耦合,甚至可以相互组合,策略模式而非工厂模式

example

cpp 复制代码
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;
    }
};

// wapper
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;
}
相关推荐
крон3 小时前
【Auto.js例程】华为备忘录导出到其他手机
开发语言·javascript·智能手机
zh_xuan3 小时前
c++ 单例模式
开发语言·c++·单例模式
老胖闲聊4 小时前
Python Copilot【代码辅助工具】 简介
开发语言·python·copilot
Blossom.1184 小时前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn
曹勖之4 小时前
基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新
开发语言·python·机器人·ros2
豆沙沙包?5 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
军训猫猫头5 小时前
96.如何使用C#实现串口发送? C#例子
开发语言·c#
liuyang-neu5 小时前
java内存模型JMM
java·开发语言
利刃大大5 小时前
【在线五子棋对战】二、websocket && 服务器搭建
服务器·c++·websocket·网络协议·项目
喜欢吃燃面6 小时前
C++刷题:日期模拟(1)
c++·学习·算法