天天看點

設計模式(十二)狀态模式 C++

#include <iostream>
using namespace std;

class Worker;

class State
{
public:
  virtual void doSomeThing(Worker *w) = 0;
};

class Worker
{
public:
  Worker();

  int getHour()
  {
    return m_hour;
  }

  void setHour(int hour) //改變狀态 7 
  {
    m_hour = hour;
  }

  State* getCurrentState()
  {
    return m_currstate;
  }

  void setCurrentState(State* state)
  {
    m_currstate = state;
  }

  void doSomeThing()
  {
    m_currstate->doSomeThing(this);
  }
private:
  int        m_hour;
  State    *m_currstate; //對象的目前狀态
};

class State1 : public State
{
public:
  void doSomeThing(Worker *w);
};

class State2 : public State
{
public:
  void doSomeThing(Worker *w);
};

void State1::doSomeThing(Worker *w)
{
  if (w->getHour() == 7 || w->getHour() == 8)
  {
    cout << "吃早飯" << endl;
  }
  else
  {
    delete w->getCurrentState();  //狀态1不滿足要轉到狀态2
    w->setCurrentState(new State2);
    w->getCurrentState()->doSomeThing(w);
  }
}

void State2::doSomeThing(Worker *w)
{
  if (w->getHour() == 9 || w->getHour() == 10)
  {
    cout << "工作" << endl;
  }
  else
  {    //狀态2不滿足要轉到狀态3,後者恢複到初始化狀态
    delete w->getCurrentState();
    w->setCurrentState(new State1); //恢複到當初狀态
    cout << "目前時間點:" << w->getHour() << "未知狀态" << endl;
  }
}

Worker::Worker()
{
  m_currstate = new State1;
}

void main()
{
  Worker *w1 = new Worker;
  w1->setHour(9);
  w1->doSomeThing();

  w1->setHour(9);
  w1->doSomeThing();

  delete w1;

  system("pause");
  return;
}      

繼續閱讀