運行在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基類指針時,會調用子類析構函數,但它只會釋放指向的子類對象(某個策略),其余子類對象是無法釋放的(其余策略)。