介绍
- 它定义了算法家族, 分别封装起来, 算法之间可以相互替换, 算法的变化不会引起算法使用者;
现实中我们会经常碰到一些变化的要求, 比如小明想让小梦高兴, 他会采取各种办法实现这个目的, 如看电影, 去旅游, 跑图书馆, 吃大餐….这些需求就是用不同的方法实现同样的目的, 可以采用策略模式.
设计
- 抽象类
class StrategyForHappy
用来封装小明让小梦高兴的方法, 而子类则通过具体的途径实现让这个目的;- 使用: 这些都属于追小梦的策略, 当然光说不行动怎么行, 有好的策略就大胆出击, 约会类
class DataAGril
中聚合了策略对象;
代码
// 接口
class IStrategy
{
public:
virtual void MakeGirlHappy() =0;
};
// 具体策略
class SeeMovies : public IStrategy
{
public:
virtual void MakeGirlHappy()
{
cout<<"we have a happy day for watching movies!"<<endl;
}
};
class TravelTogether : public IStrategy
{
public:
virtual void MakeGirlHappy()
{
cout<<"We have a memorable day because of the beautiful scenery!"<<endl;
}
};
// 对策略使用的封装
class Date
{
private:
bool DateResult;
public:
Date():DateResult(0){};
void CourtGirl(IStrategy* strategy)
{
cout<<"xiaoming is dating xiaomeng..."<<endl;
strategy->MakeGirlHappy();
DateResult = true;
}
void Result()
{
if(DateResult)
cout<<"xiaoming successfully court xiaomeng!"<<endl;
else
cout<<"xiaoming court xiaomeng failed!"<<endl;
}
};
//客户端使用
int main()
{
cout<<"xiaoming like xiaomeng, wants to date her.."<<endl;
Date* date = new Date;
date->CourtGirl(new SeeMovies);
date->Result();
return 0;
}
总结
- 策略模式其实仅仅是简单的使用的封装继承, 来对具体的策略进行了封装, 让上层使用者可以不考虑具体使用那种策略;
- 客户端还是要知道当前在使用哪种策略或是要使用哪种策略;