软件设计师2006年11月下午试题6(C++ 状态模式)

简介: [说明]  传输门是传输系统中的重要装置。传输门具有 Open(打开)、Closed(关闭)、Opening(正在打开)、StayOpen(保持打开)、Closing(正在关闭)五种状态。触发传输门状态转 换的事件有 click、complete 和 timeout 三种。

[说明]
  传输门是传输系统中的重要装置。传输门具有 Open(打开)、Closed(关闭)、Opening(正在打开)、StayOpen(保持打开)、Closing(正在关闭)五种状态。触发传输门状态转 换的事件有 click、complete 和 timeout 三种。事件与其相应的状态转换如图 6-1 所示。

    

 

下面的[C++代码 1]与[C++代码 2]分别用两种不同的设计思路对传输门进行状态模拟, 请填补代码中的空缺。
[C++代码 1]
  const int CLOSED = 1; const int OPENING = 2;
  const int OPEN = 3; const int CLOSING = 4;
  const int STAYOPEN = 5; //定义状态变量,用不同整数表示不同状态

  class Door {
  private:
   int state; //传输门当前状态
   void setState(int state){ this->state = state; } //设置当前状态
  public:
   Door():state(CLOSED){};
   void getState(){ //根据当前状态输出相应的字符串
    switch(state){
     case OPENING: cout <<"OPENING" << endl; break;
     case CLOSED: cout << "CLOSED" << endl; break;
     case OPEN: cout << "OPEN" << endl; break;
     case CLOSING: cout << "CLOSING" << endl; break;
     case STAYOPEN: cout << "STAYOPEN" << endl; break;
    }
   }
   void click() { //发生click事件时进行状态转换
    if ( state==CLOSED || state==CLOSING) setState(OPENING);
    else if ( state==STAYOPEN  || state==OPENING) setState(CLOSING);
    else if ( state=OPEN  ) setState(STAYOPEN);
   }
   void timeout(){ //发生timeout事件时进行状态转换
    if (state == OPEN) setState(CLOSING);
   }
   void complete(){ //发生complete事件时进行状态转换
    if (state == OPENING) setState(OPEN);
    else if (state == CLOSING) setState(CLOSED);
   }
  };
  int main(){
   Door aDoor;
   aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.complete();
   aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.click();
   aDoor.getState(); return 0;
  }

[C++代码 2]
  class Door {
  public:
   DoorState *CLOSED, *OPENING, *OPEN, *CLOSING, *STAYOPEN, *state;
   Door();
   virtual ~Door(){ ……  //释放申请的内存,此处代码省略};
   void setState(DoorState *state) { this->state = state; }
   void getState(){
    // 此处代码省略,本方法输出状态字符串,
    // 例如,当前状态为CLOSED时,输出字符串为“CLOSED”
   };
   void click();
   void timeout();
   void complete();
  };


  Door::Door(){
   CLOSED = new DoorClosed(this);    OPENING = new DoorOpening(this);
   OPEN = new DoorOpen(this);      CLOSING = new DoorClosing(this);
   STAYOPEN = new DoorStayOpen(this);  state = CLOSED;
  }
  void Door::click(){ state->click();}
  void Door::timeout(){ state->timeout(); }
  void Door::complete(){ state->complete(); }

  class DoorState //定义一个抽象的状态,它是所有状态类的基类
  {
  protected: Door *door;
  public:
   DoorState(Door *door) { this->door = door; }
   virtual ~DoorState(void);
   virtual void click() {}
   virtual void complete() {}
   virtual void timeout() {}
  };

  class DoorClosed :public DoorState{ //定义一个基本的 Closed 状态
  public:
   DoorClosed(Door *door):DoorState(door) {}
   virtual ~ DoorClosed (){}
   void click();
  };
  void DoorClosed::click() { door->setState(door->OPENING); }
  // 其它状态类的定义与实现代码省略

  int main(){
   Door aDoor;
   aDoor.getState(); aDoor.click();  aDoor.getState(); aDoor.complete();
   aDoor.getState(); aDoor.timeout(); aDoor.getState(); return 0;
  }

相关文章
|
5月前
|
设计模式 人工智能 监控
C++状态模式探索:从设计到实践的全面指南
C++状态模式探索:从设计到实践的全面指南
90 0
|
机器学习/深度学习 算法 C++
2019第十届蓝桥杯大赛青少年创意编程省赛C++组试题解析
2019第十届蓝桥杯大赛青少年创意编程省赛C++组试题解析
399 0
|
5月前
|
算法 IDE Java
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
93 0
|
5月前
|
Java API 开发工具
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(三)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
59 0
|
5月前
|
Java 数据处理 数据库
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(二)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
71 0
|
5月前
|
存储 算法 Java
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(一)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
57 0
|
5月前
|
C++
第十三届蓝桥杯B组C++(试题C:刷题统计)
第十三届蓝桥杯B组C++(试题C:刷题统计)
46 0
|
5月前
|
C++
第十三届蓝桥杯B组C++(试题B:顺子日期)
第十三届蓝桥杯B组C++(试题B:顺子日期)
78 0
|
5月前
|
C++
C++【二叉树进阶试题】
C++【二叉树进阶试题】
48 0
|
设计模式 C++ 开发者
设计模式之状态模式(C++)
设计模式之状态模式(C++)