• 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基类指针时,会调用子类析构函数,但它只会释放指向的子类对象(某个策略),其余子类对象是无法释放的(其余策略)。

  • 相关阅读:
    探索技术之上科技伦理,阿里巴巴成立科技伦理治理委员会
    ImmunoChemistry艾美捷ELISA洗涤缓冲液说明书
    redis redisson(仅供自己参考)
    APS生产计划排产在注塑行业的应用
    自适应滤波器更新算法-EP2
    IPv4数据报格式
    网络安全(黑客)自学
    try-with-resources
    【开源毕设】前后端分离,基于 Vue 和 SpringBoot 的假日旅社管理系统
    python接口自动化测试 | yaml数据驱动参数化,看完这一篇就够了
  • 原文地址:https://blog.csdn.net/qq_42692132/article/details/139362298