C++设计模式-策略模式,AI角色动态选择行为

运行在VS2022,x86,Debug下。

27. 策略模式

在这里插入图片描述

  • 策略模式让算法的选择与使用独立开来,使得代码更灵活、可扩展和易维护。
  • 应用:如在游戏开发中,AI角色需要根据环境和条件做出不同的行为,如寻路、攻击、躲避等。可以使用策略模式,定义一个行为策略接口,然后分别实现寻路决策类、攻击决策类、躲避决策类等。根据实际情况动态地选择合适的行为策略。
  • 实现
    • 抽象策略类,即定义策略接口。
    • 具体策略类,即实现策略接口。
    • 上下文类,负责使用策略对象。
  • 代码如下。
//抽象策略类:行为策略接口
class AIStrategy 
{
public:
    virtual void action() = 0;
};

//具体策略类:寻路决策类
class FindWayStrategy :public AIStrategy
{
public:
    void action() { cout << "Finding a way" << endl; }
};

//具体策略类:攻击决策类
class AttackStrategy :public AIStrategy
{
public:
    void action() { cout << "attacking" << endl; }
};

//具体策略类:躲避决策类
class AvoidStrategy :public AIStrategy
{
public:
    void action() { cout << "avoiding" << endl; }
};

//上下文类,负责使用策略对象
class Context 
{
private:
    AIStrategy* aiStrategy; //抽象策略类指针

public:
    void setStrategy(AIStrategy* strategy) { aiStrategy = strategy;} //设置策略

    void action() const  //行为
    {
        if (aiStrategy) { aiStrategy->action();}
    }
};

int main()
{
    FindWayStrategy* findWayStrategy = new FindWayStrategy();
    AttackStrategy* attackStrategy = new AttackStrategy();

    //算法的选择与使用独立开来
    Context context; 
    context.setStrategy(findWayStrategy); //选择策略1
    context.action(); //使用
    context.setStrategy(attackStrategy); //选择策略2
    context.action(); //使用

    delete findWayStrategy; 
    delete attackStrategy;

    return 0;
}

注意 :内存释放问题,这里手动释放子类对象。因为将基类析构函数声明为虚函数,当delete基类指针时,会调用子类析构函数,但它只会释放指向的子类对象(某个策略),其余子类对象是无法释放的(其余策略)。

相关推荐

  1. 设计模式 行为型】策略模式

    2024-06-05 19:48:06       49 阅读
  2. 设计模式行为设计模式——策略模式

    2024-06-05 19:48:06       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-05 19:48:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-05 19:48:06       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-05 19:48:06       87 阅读
  4. Python语言-面向对象

    2024-06-05 19:48:06       96 阅读

热门阅读

  1. Spring Cloud Gateway通过配置文件方式提供路由服务

    2024-06-05 19:48:06       29 阅读
  2. 竹纤维家装元宇宙:虚拟空间与绿色生活的融合

    2024-06-05 19:48:06       33 阅读
  3. 生活中的人工智能

    2024-06-05 19:48:06       32 阅读
  4. SVN在Linux服务器下部署过程

    2024-06-05 19:48:06       31 阅读
  5. 如何评价GPT-4o?

    2024-06-05 19:48:06       32 阅读
  6. Python for的用法:深入解析与实战应用

    2024-06-05 19:48:06       33 阅读
  7. Sass的简单总结

    2024-06-05 19:48:06       25 阅读
  8. Rust Learning Day1

    2024-06-05 19:48:06       32 阅读
  9. 简单的学生信息管理系统

    2024-06-05 19:48:06       34 阅读