C++常用设计模式之:策略模式
策略模式也是常见的设计模式之一,一般在程序中如果遇到条件可能变化的if/else或者switch/case语句,就可以想想是否可以用策略模式来替换了。
策略模式的定义:定义了一系列算法,把它们一个个封装起来,并且使它们可以相互替换(变化的部分)。策略模式可以使算法独立于使用算法的客户端(稳定的部分)。
在实际应用中我们也是用策略模式来解决选择的问题。例如:我们周末选择哪项体育运动的问题,是打乒乓球呢,还是踢足球呢,还是打篮球呢。。。总之就是要选择。
UML结构图如下:
下面我用伪码来表述上面的例子。
//常规的做法,用if/else或者switch/case
enum Sports {TableTennis,Football,Basketball}
class Play
{
public:
Sports sp;
public:
void DoSports()
{
if( sp == TableTennis)
{
//打乒乓球
}
else if( sp == Football)
{
//踢足球
}
else if( sp == Basketball)
{
//打篮球
}
}
};
//这个时候如果要加一项运动选择该怎么办,比如多加一个游泳?
//那就先多加一个游泳的枚举,再在DoSports()函数中多加一个else if
//策略模式的做法
class SportsStrategy
{
public:
virtual ~SportsStrategy() {}
virtual void DoSports()=0;//运动策略基类
};
//乒乓球
class TableTennis :public SportsStrategy
{
public:
void DoSports(){
//打乒乓球
}
};
//足球
class FootBall :public SportsStrategy
{
public:
void DoSports(){
//踢足球
}
};
//篮球
class BasketBall :public SportsStrategy
{
public:
void DoSports(){
//打篮球
}
};
//现在可以用策略来做出选择了
class Play
{
private:
SportsStrategy *m_pSports;//运动策略基类的指针
public:
//构造函数,要传一个基类的指针进来
Play(SportsStrategy * pSports)
{
m_pSports = pSports;
}
//开始玩耍吧
void Doit
{
m_pSports->DoSports();//多态调用
}
};
//应用
int main()
{
//打乒乓球吗?
SportsStrategy *pingpang = new TableTennis();
Play *pP1 = new Play(pingpang);
pP1->Doit();
//踢足球吗?
SportsStrategy *football = new FootBall();
Play *pP2 = new Play(football);
pP2->Doit();
//。。。。。
return 0;
}
//这个时候要加一个游泳怎么办?那就从SportsStrategy继承一个游泳的子类就好了。
//而且这样做还省去了很多无用的if/else判断不是吗?毕竟每次只能选择一个
现在返回那张UML图我们再来看
结合到我们的例子和策略模式的定义,其中稳定的部分就是我们的运动策略基类SportsStrategy和调用类Play。变化的各种各样的运动选择。我们是通过组合的方式(Play类中包含一个SportsStrategy类的指针)实现的多态调用。
最后,如果理解的有偏差,还请指出!
版权声明:本文为zouyang85457013原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。