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;
}

运行结果

应用场景

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

优点

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

总结

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

相关推荐
努力努力再努力wz20 小时前
【C++进阶系列】:万字详解智能指针(附模拟实现的源码)
java·linux·c语言·开发语言·数据结构·c++·python
凤年徐20 小时前
【C++】string的模拟实现
c语言·开发语言·c++
牟同學20 小时前
从赌场到AI:期望值如何用C++改变世界?
c++·人工智能·概率论
夜晚中的人海20 小时前
【C++】智能指针介绍
android·java·c++
简小瑞20 小时前
VSCode源码解密:一行代码解决内存泄漏难题
前端·设计模式·visual studio code
Asort20 小时前
JavaScript设计模式(九)——装饰器模式 (Decorator)
前端·javascript·设计模式
rongqing201920 小时前
Google 智能体设计模式:模型上下文协议 (MCP)
设计模式
小小前端_我自坚强20 小时前
2025WebAssembly详解
前端·设计模式·前端框架
笨手笨脚の20 小时前
设计模式-责任链模式
设计模式·责任链模式·行为型设计模式
chennn1221 小时前
c++相关学习
开发语言·c++·学习