设计模式之策略模式(C++)

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

一、策略模式是什么?

       策略模式是一种行为型的软件设计模式,针对某个行为,在不同的应用场景下,有不同的实现算法,并且可以互相替换。比如两军交战,军队会采用不同的阵法、策略、兵法应对不同的战况。

       策略模式的优点:

  1. 便于管理算法族。一套策略对应一套算法,该模式可以很好地进行维护和管理。
  2. 避免使用多重条件语句,如if else和switch。庞大的系统中,过多的多重条件语句会让代码显得臃肿和不易维护,提高出错概率。
  3. 封装算法。提高了算法的保密性和安全性。
  4. 符合开闭原则。

      策略模式的缺点:

  1. 客户端需要了解每种策略,并自行决定何时何地使用何种策略。
  2. 随着策略增多,策略类数量增加,要注意对类的维护。

二、策略模式

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;也可以在客户端创建策略,再将策略指针传入环境类。

三、总结

       我尽可能用较通俗的话语和直观的代码例程,来表述我对策略模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解策略模式。

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

猜你喜欢

转载自blog.csdn.net/zhaitianbao/article/details/130010660