合肥网络公司排行榜,网站优化定做,温州电子商务网站建设,遵义网站制作和推广策略模式 介绍示例示例测试运行结果应用场景优点总结 介绍
策略模式是一种行为设计模式。在策略模式中#xff0c;可以创建一些独立的类来封装不同的算法#xff0c;每一个类封装一个具体的算法#xff0c;每一个封装算法的类叫做策略(Strategy)#xff0c;为了保证这些策… 策略模式 介绍示例示例测试运行结果应用场景优点总结 介绍
策略模式是一种行为设计模式。在策略模式中可以创建一些独立的类来封装不同的算法每一个类封装一个具体的算法每一个封装算法的类叫做策略(Strategy)为了保证这些策略的一致性一般会用一个接口或者抽象类做统一的规定所有的策略类都需要遵守这个接口或者抽象类规定的行为。同时定义一个 Context 类来管理算法的使用通过参数将策略类传递给Context类运行时动态的决定调用那个具体的算法。
示例
有一个小组去参加比赛记分机制是取每组得分的最高分每组得分的最低分还有每组得分的平均分三种计分制下面使用策略模式实现这种记分机制。
#includeiostream
#include vector
#include algorithm //min_element()
#include numeric //accumulate()
class Score //得分
{
public:virtual ~Score() default;virtual double getScore(vectorint ) 0;
};class MaxScore :public Score //最高分数
{
public:double getScore(vectorint 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(vectorint 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(vectorint 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 vectorint 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;vectorint m_scoreVec;
};
示例测试
这里省去头文件
int main()
{vectorint 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;
}运行结果 应用场景
在某个系统中需要实现不同的算法并且这些算法可以互相替换。需要根据不同的条件在运行时动态地选择算法。算法的实现代码比较复杂需要将其封装起来使得代码更具可读性。
优点
避免使用过程中出现分支语句提高代码的可维护性和扩展性。
总结
策略模式实际上就是一种多态的应用。