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 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>