(十)状态模式

状态模式是当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

当一个对象的状态转换需要太多的if-else或者其他的判断语句的时候,就可以用这个模式,把状态的判断逻辑转移到表示不同状态的一系列的类中,也就是把本来在一起的各个判断语句解开来。



用一个表示不同时间段程序员状态的例子:

#include <iostream>
#include <string>

using namespace std;

class work;

class state
{
      public:
             virtual void write_program( work *w ) {}
};

class work
{
      public:
             work() { finish_work = false; }
             void set_state( state *s )
             {
                  current = s;
             }
             void set_time( double h )
             {
                  hour = h;
             }
             void work_finish()
             {
                  finish_work = true;
             }
             double get_time()
             {
                  return hour;
             }
             bool get_finish_work()
             {
                 return finish_work; 
             }
             void writeprogram()
             {
                  current->write_program( this );
             }
      private:
              state *current;
              bool finish_work;
              double hour;
};

class sleeping_state : public state
{
      public:
             void write_program( work *w )
             {
                  cout << " 当前时间 " << w->get_time() << " 顶不住了,睡着了 " << endl; 
             }
};
             
class rest_state : public state
{
      public:
             void write_program( work *w )
             {
                  cout << " 当前时间 " << w->get_time() << " 搞定收工下班 " << endl;
             }
};

class evening_state : public state
{
      public:
             void write_program( work *w )
             {
                  if( w->get_finish_work() )
                  {
                      w->set_state( new rest_state );
                      w->writeprogram();
                  }
                  else
                  {
                      if( w->get_time() < 21 )
                      {
                          cout << " 当前时间 " <<  w->get_time() <<  " 叫你平时不好好看书,现在加班啦 " << endl;
                      }
                      else
                      {
                          w->set_state( new sleeping_state );
                          w->writeprogram();
                      }
                  }
             }
};

class afternoon_state : public state
{
      public:
             void write_program( work *w )
             {
                  if( w->get_time() < 17 )
                  {
                      cout << " 当前时间 " << w->get_time() << " 下午了,状态还行,码代码ing " << endl;
                  }
                  else
                  {
                      w->set_state( new evening_state );
                      w->writeprogram();
                  }
             }
};

class noon_state : public state
{
      public:
             void write_program( work *w )
             {
                  if( w->get_time() < 13 )
                  {
                      cout << " 当前时间 " << w->get_time() << " 中午刚吃完饭,不睡不行啊 " << endl;
                  }
                  else
                  {
                      w->set_state( new afternoon_state );
                      w->writeprogram();
                  }
             }
};

class forenoon_state : public state
{
      public:
             void write_program( work *w )
             {
                  if( w->get_time() < 12 )
                  {
                      cout << " 当前时间 " << w->get_time() << " 状态正好着,努力码代码ing " << endl;
                  }
                  else
                  {
                      w->set_state( new noon_state );
                      w->writeprogram();
                  }
             }
};

int main()
{
    work *w = new work;
    w->set_time( 9 );
    w->set_state( new forenoon_state );
    w->writeprogram();
    w->set_time( 13 );
    w->writeprogram();
    w->set_time( 18 );
    w->writeprogram();
    
    //w->work_finish();
    //w->set_time( 20 );
    //w->writeprogram();
    
    w->set_time( 22 );
    w->writeprogram();
    
}

在代码中我们的work类就像是context类一样,刚开始的时候我们把work的对象w中的时间初始化为9点,state对象current初始化为forenoon_state,用w中的writeprogram来得出此时的状态,当时间hour改变的时候根据hour来决定要new一个什么类给w中的current,如果要想增加什么状态的话,就再写一个继承state的类,或许还要改一下相关的状态类的判断条件就行了,比起把一大堆if-else语句挤在一起来判断要好得多!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值