模式动机

  • 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化。
  • 在UML中可以使用状态图来描述对象状态的变化。

    模式定义

    状态模式(State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。

模式结构

状态模式包含如下角色

  • Context:环境类
  • State:抽象状态类
  • ConcreteState:具体状态类

状态模式 - 图1

时序图

状态模式 - 图2

代码分析

  1. #include <iostream>
  2. #include "Context.h"
  3. #include "ConcreteStateA.h"
  4. #include "ConcreteStateB.h"
  5. using namespace std;
  6. int main(int argc, char *argv[])
  7. {
  8. char a = '0';
  9. if('0' == a)
  10. cout << "yes" << endl;
  11. else
  12. cout << "no" << endl;
  13. Context* c = new Context();
  14. c->request();
  15. c->request();
  16. c->request();
  17. delete c;
  18. return 0;
  19. }
  1. // Context.h
  2. #param once
  3. #include "state.h"
  4. class Context
  5. {
  6. public:
  7. Context();
  8. virtual ~Context();
  9. void changeState(State* st);
  10. void request();
  11. private:
  12. State *m_pState;
  13. };
  1. //ConText.cpp
  2. #include "Context.h"
  3. #include "ConcreteStateA.h"
  4. Context::Context(){
  5. m_pState = ConcreteStateA::Instance();
  6. }
  7. Context::~Context() {
  8. }
  9. void Context::changeState(State *st) {
  10. m_
  11. }