策略模式
- 介绍
- 示例
- 示例测试
- 运行结果
- 应用场景
- 优点
- 总结
介绍
策略模式是一种行为设计模式。在策略模式中,可以创建一些独立的类来封装不同的算法,每一个类封装一个具体的算法,每一个封装算法的类叫做策略(Strategy),为了保证这些策略的一致性,一般会用一个接口或者抽象类做统一的规定,所有的策略类都需要遵守这个接口或者抽象类规定的行为。同时定义一个 Context 类来管理算法的使用,通过参数将策略类传递给Context类,运行时动态的决定调用那个具体的算法。
示例
有一个小组去参加比赛,记分机制是取每组得分的最高分,每组得分的最低分,还有每组得分的平均分三种计分制,下面使用策略模式实现这种记分机制。
#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());//algorithmreturn *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);//numericreturn 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;
};
示例测试
这里省去头文件
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;
}
运行结果
应用场景
- 在某个系统中需要实现不同的算法,并且这些算法可以互相替换。
- 需要根据不同的条件,在运行时动态地选择算法。
- 算法的实现代码比较复杂,需要将其封装起来,使得代码更具可读性。
优点
避免使用过程中出现分支语句,提高代码的可维护性和扩展性。
总结
策略模式实际上就是一种多态的应用。