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 小时前
深入 C++ STL:从 unordered_set与unordered_map到底层哈希表的原理与实现
数据结构·c++·散列表
FlightYe2 小时前
音视频修炼之基础理论(五):AAC格式与解析
android·linux·c++·音视频·aac
ShineWinsu3 小时前
对于MySQL:数据库的操作的解析
linux·数据库·c++·mysql·面试·笔试·库的操作
云小逸3 小时前
C++ 第一阶段:对象、内存与生命周期
开发语言·c++
夜航海图3 小时前
S-57 数据解剖:把一个 ENC 文件拆给你看
c++
(Charon)3 小时前
【C++】网络缓冲区设计(三):Chain Buffer链式缓冲区、动态扩容与跨节点读写
服务器·c++
软行5 小时前
LeetCode 每日一题 3876. 构造奇偶一致的数组 II
c++·算法·leetcode
繁星蓝雨5 小时前
C++设计原理———重载(extern “C“的由来、顺序依赖、语义依赖、overload、名称修饰符、对象操作、运算符重载、新增运算符、枚举和布尔类型)
c语言·c++·extern c·overload·重载·语义依赖·顺序依赖
handler015 小时前
【Linux】虚拟地址空间解析
linux·运维·c++·线程·进程·虚拟地址空间·虚拟地址
(Charon)5 小时前
【C++】网络缓冲区设计(二):Ring Buffer环形缓冲区、head/tail与跨界读写
开发语言·c++