运行在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); //选择策略1context.action(); //使用context.setStrategy(attackStrategy); //选择策略2context.action(); //使用delete findWayStrategy; delete attackStrategy;return 0;
}
注意 :内存释放问题,这里手动释放子类对象。因为将基类析构函数声明为虚函数,当delete基类指针时,会调用子类析构函数,但它只会释放指向的子类对象(某个策略),其余子类对象是无法释放的(其余策略)。