策略模式
介绍
策略模式是一种行为设计模式。在策略模式中,可以创建一些独立的类来封装不同的算法,每一个类封装一个具体的算法,每一个封装算法的类叫做策略(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;
}
运行结果
应用场景
- 在某个系统中需要实现不同的算法,并且这些算法可以互相替换。
- 需要根据不同的条件,在运行时动态地选择算法。
- 算法的实现代码比较复杂,需要将其封装起来,使得代码更具可读性。
优点
避免使用过程中出现分支语句,提高代码的可维护性和扩展性。
总结
策略模式实际上就是一种多态的应用。