一、策略模式是什么?
策略模式是一种行为型的软件设计模式,针对某个行为,在不同的应用场景下,有不同的实现算法,并且可以互相替换。比如两军交战,军队会采用不同的阵法、策略、兵法应对不同的战况。
策略模式的优点:
- 便于管理算法族。一套策略对应一套算法,该模式可以很好地进行维护和管理。
- 避免使用多重条件语句,如if else和switch。庞大的系统中,过多的多重条件语句会让代码显得臃肿和不易维护,提高出错概率。
- 封装算法。提高了算法的保密性和安全性。
- 符合开闭原则。
策略模式的缺点:
- 客户端需要了解每种策略,并自行决定何时何地使用何种策略。
- 随着策略增多,策略类数量增加,要注意对类的维护。
二、策略模式
2.1 结构图
客户端即Main主函数,根据不同场景选用不同策略。
2.2 代码示例
场景描述:我有一支军队,先让其使用火攻震慑对方,再用离间策反敌人。
//Strategy.h /****************************************************/ #pragma once #include <iostream> #include <unordered_map> #include <vector> #include <list> using namespace std; // 策略类型 enum WARCRAFT_TYPE { FIREATTACK, // 火攻 SOWDISCORD, // 离间 }; // 定义策略接口-兵法 class Warcraft { public: // 执行 virtual void execute() = 0; }; // 实现具体策略类-火攻 class FireAttack : public Warcraft { public: // 执行 virtual void execute() { cout << "执行'火攻'!" << endl; } }; // 实现具体策略类-离间 class SowDiscord : public Warcraft { public: // 执行 virtual void execute() { cout << "执行'离间'!" << endl; } }; // 背景类-军队 class Army { public: // 构造函数 Army(WARCRAFT_TYPE type){ setWarcraft(type); } // 析构函数 ~Army() { if(m_warcraft) { delete m_warcraft; m_warcraft = nullptr; } } // 设置策略 void setWarcraft(WARCRAFT_TYPE type) { // 清空旧策略 if (m_warcraft) { delete m_warcraft; m_warcraft = nullptr; } // 使用新策略 switch (type) { case FIREATTACK: m_warcraft = new FireAttack(); break; case SOWDISCORD: m_warcraft = new SowDiscord(); break; default: cout << "没有该策略。" << endl; break; } } // 执行兵法 void executeWarcraft() { cout << "准备!" << endl; m_warcraft->execute(); cout << "结束!" << endl; } private: Warcraft* m_warcraft; };
//main.cpp /****************************************************/ #include <iostream> #include <string> #include "Strategy.h" using namespace std; int main() { Army *army = new Army(FIREATTACK); army->executeWarcraft(); army->setWarcraft(SOWDISCORD); army->executeWarcraft(); delete army; army = nullptr; return 0; }
程序结果如下。
策略模式的实现有很多种,我是采用了枚举的形式,将具体策略的创建放在了环境类中,类中new别忘了delete;也可以在客户端创建策略,再将策略指针传入环境类。
三、总结
我尽可能用较通俗的话语和直观的代码例程,来表述我对策略模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解策略模式。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!