济南行知网站建设,创意专业网站建设,遵义高端网站建设,摄影建设网站作者#xff1a;翟天保Steven 版权声明#xff1a;著作权归作者所有#xff0c;商业转载请联系作者获得授权#xff0c;非商业转载请注明出处 一、策略模式是什么#xff1f; 策略模式是一种行为型的软件设计模式#xff0c;针对某个行为#xff0c;在不同的应用场景下翟天保Steven 版权声明著作权归作者所有商业转载请联系作者获得授权非商业转载请注明出处 一、策略模式是什么 策略模式是一种行为型的软件设计模式针对某个行为在不同的应用场景下有不同的实现算法并且可以互相替换。比如两军交战军队会采用不同的阵法、策略、兵法应对不同的战况。 策略模式的优点
便于管理算法族。一套策略对应一套算法该模式可以很好地进行维护和管理。避免使用多重条件语句如if else和switch。庞大的系统中过多的多重条件语句会让代码显得臃肿和不易维护提高出错概率。封装算法。提高了算法的保密性和安全性。符合开闭原则。策略模式的缺点
客户端需要了解每种策略并自行决定何时何地使用何种策略。随着策略增多策略类数量增加要注意对类的维护。二、策略模式
2.1 结构图 客户端即Main主函数根据不同场景选用不同策略。 2.2 代码示例 场景描述我有一支军队先让其使用火攻震慑对方再用离间策反敌人。
//Strategy.h
/****************************************************/
#pragma once
#include iostream
#include unordered_map
#include vector
#include listusing 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.husing namespace std;int main()
{Army *army new Army(FIREATTACK);army-executeWarcraft();army-setWarcraft(SOWDISCORD);army-executeWarcraft();delete army;army nullptr;return 0;
} 程序结果如下。 策略模式的实现有很多种我是采用了枚举的形式将具体策略的创建放在了环境类中类中new别忘了delete也可以在客户端创建策略再将策略指针传入环境类。 三、总结 我尽可能用较通俗的话语和直观的代码例程来表述我对策略模式的理解或许有考虑不周到的地方如果你有不同看法欢迎评论区交流希望我举的例子能帮助你更好地理解策略模式。 如果文章帮助到你了可以点个赞让我知道我会很快乐~加油