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

策略模式

介绍

策略模式是一种行为设计模式。在策略模式中,可以创建一些独立的类来封装不同的算法,每一个类封装一个具体的算法,每一个封装算法的类叫做策略(Strategy),为了保证这些策略的一致性,一般会用一个接口或者抽象类做统一的规定,所有的策略类都需要遵守这个接口或者抽象类规定的行为。同时定义一个 Context 类来管理算法的使用,通过参数将策略类传递给Context类,运行时动态的决定调用那个具体的算法。

示例

有一个小组去参加比赛,记分机制是取每组得分的最高分,每组得分的最低分,还有每组得分的平均分三种计分制,下面使用策略模式实现这种记分机制。

cpp 复制代码
#include<iostream>
#include <vector>
#include <algorithm>  //min_element()
#include <numeric> //accumulate()
class Score //得分
{
public:
	virtual ~Score() = default;
	virtual double  getScore(vector<int> &) = 0;
};

class MaxScore :public Score //最高分数
{
public:
	double getScore(vector<int> &vec)override 
	{
		if (vec.empty())
		{
			return 0.0;
		}
		auto score = std::max_element(vec.begin(), vec.end());
		return *score;
	}
};

class MinScore :public Score //最低分数
{
public:
	double getScore(vector<int> &vec)override 
	{
		if (vec.empty())
		{
			return 0.0;
		}
		auto minScore = min_element(vec.begin(),vec.end());//algorithm
		return *minScore;
	}
};

class AverageScore :public Score //平均分数
{
public:
	double getScore(vector<int> &vec)override
	{
		if (vec.empty()) 
		{
			return 0.0;
		}
		double sum = accumulate(vec.begin(),vec.end(),0.0);//numeric
		return sum/vec.size();
	}
};

class Contenxt 
{
public:
	Contenxt(const vector<int> &scores,Score *pScore) :m_pScore(pScore), m_scoreVec(scores){}
	
	void setScore(Score *pScore) 
	{
		m_pScore = pScore; 
	}
	double finalScore()
	{
		return m_pScore->getScore(m_scoreVec);
	}
private:
	Score *m_pScore;
	vector<int> m_scoreVec;
};

示例测试

这里省去头文件

cpp 复制代码
int main() 
{
	vector<int> scores = {2,3,6,2,7,4};
	Contenxt manager(scores,new MaxScore);
	double finalScore = manager.finalScore();
	cout << "finalScore =" << finalScore << endl;

	manager.setScore(new MinScore);
	double minScore = manager.finalScore();
	cout << "minscore =" << minScore<< endl;

	manager.setScore(new AverageScore);
	double avgScore = manager.finalScore();
	cout << "avgScore=" << avgScore<< endl;
	return 0;
}

运行结果

应用场景

  • 在某个系统中需要实现不同的算法,并且这些算法可以互相替换。
  • 需要根据不同的条件,在运行时动态地选择算法。
  • 算法的实现代码比较复杂,需要将其封装起来,使得代码更具可读性。

优点

避免使用过程中出现分支语句,提高代码的可维护性和扩展性。

总结

策略模式实际上就是一种多态的应用。

相关推荐
玖玥拾8 小时前
C/C++ 基础笔记(十四)多态与模板编程
c语言·c++·多态·模板
Roann_seo%8 小时前
C++文件操作完全指南:从文本读写到二进制文件处理
开发语言·c++
坚果派·白晓明9 小时前
【鸿蒙PC】SDL3 适配:AtomCode + Skills 快速集成 NAPI 测试工具
c++·华为·ai编程·harmonyos·atomcode
凡人叶枫10 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
我爱cope11 小时前
【Agent智能体26 | 多智能体-多智能体工作流】
人工智能·设计模式·语言模型·职场和发展
凡人叶枫11 小时前
Effective C++ 条款16:成对使用 new 和 delete 时要采取相同形式
开发语言·c++·effective c++
不吃土豆的马铃薯11 小时前
C++ 高性能网络缓冲区 Buffer 源码解析
linux·服务器·开发语言·网络·c++
.千余12 小时前
【C++】C++继承入门(下):友元、静态成员与菱形继承的底层逻辑
开发语言·c++·笔记·学习·其他
初中就开始混世的大魔王12 小时前
6 Fast DDS-传输层
开发语言·c++·中间件·信息与通信
代码中介商14 小时前
C++ 智能指针完全指南(三):weak_ptr 与循环引用
开发语言·c++