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

运行结果

应用场景

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

优点

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

总结

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

相关推荐
咖啡八杯1 天前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
apocelipes1 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
槑有老呆1 天前
从 Prompt Engineering 到 Harness Engineering:AI 编程的下一次跃迁
设计模式
HjhIron2 天前
从Prompt到Context:大模型应用开发的范式转移
设计模式·aigc·ai编程
郝学胜_神的一滴3 天前
CMake 034:生成器表达式:解耦构建时序、精简分支逻辑的终极利器
c++·cmake
咖啡八杯3 天前
GoF设计模式——中介者模式
java·后端·spring·设计模式
见过夏天3 天前
C++ 基础入门完全指南
c++
胡萝卜术4 天前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
亦暖筑序5 天前
Java 8老系统Browser Agent实战:三层拦截把AI操作后台变成可审计流程
java·后端·设计模式
用户805533698035 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt