繁体   English   中英

需要澄清状态模式的工作原理

[英]Need some clarification on how the state pattern works

#include <iostream>
using namespace std;
class Machine
{
  class State *current;
  public:
    Machine();
    void setCurrent(State *s)
    {
        current = s;
    }
    void on();
    void off();
};

class State
{
  public:
    virtual void on(Machine *m)
    {
        cout << "   already ON\n";
    }
    virtual void off(Machine *m)
    {
        cout << "   already OFF\n";
    }
};

void Machine::on()
{
  current->on(this);
}

void Machine::off()
{
  current->off(this);
}

class ON: public State
{
  public:
    ON()
    {
        cout << "   ON-ctor ";
    };
    ~ON()
    {
        cout << "   dtor-ON\n";
    };
    void off(Machine *m);
};

class OFF: public State
{
  public:
    OFF()
    {
        cout << "   OFF-ctor ";
    };
    ~OFF()
    {
        cout << "   dtor-OFF\n";
    };
    void on(Machine *m)
    {
        cout << "   going from OFF to ON";
        m->setCurrent(new ON());
        delete this;
    }
};

void ON::off(Machine *m)
{
  cout << "   going from ON to OFF";
  m->setCurrent(new OFF());
  delete this;
}

Machine::Machine()
{
  current = new OFF();
  cout << '\n';
}

int main()
{
  void(Machine:: *ptrs[])() = 
  {
    Machine::off, Machine::on
  };
  Machine fsm;
  int num;
  while (1)
  {
    cout << "Enter 0/1: ";
    cin >> num;
    (fsm. *ptrs[num])();
  }
}

有一些代码我不完全理解。

首先,这到底是做什么的?

(fsm. *ptrs[num])();

看起来它正在调用 state 的默认构造函数,但我不完全确定。 另外,我不明白在哪里调用 on 和 off 方法。 我认为对象机器是 on 和 off 方法的调用对象,但我什至不确定。

最后,我们为什么要破坏它?

void on(Machine *m)
{
    cout << "   going from OFF to ON";
    m->setCurrent(new ON());
    delete this;
}

它仅用于内存管理吗?

我用两个函数指针和一些注释重写了代码:我使用了 2 个差异指针,而不是函数指针数组,我使用 if else 来决定切换状态。

主要的:

int main()
{
  void (Machine::*offptr)() = &Machine::off;    //offptr is a member funct pointer that now points to Machine::off function
  void (Machine::*onptr)() = &Machine::on;      //onptr is a member funct pointer that now points to Machine::on function
  Machine fsm;
  int num;
  while (1)
  {
      cout<<"Enter 0/1: ";
      cin>>num;
      if( num == 0 )
      {
          (fsm.*offptr)();          //Here your are calling the function pointed to by the offptr (i.e., Machine::off) using the pointer
      }
      else if( num == 1 )
      {
          (fsm.*onptr)();           //Here your are calling the function pointed to by the onptr (i.e., Machine::on) using the pointer
      }
  }

}

在你的例子中,所有的决定都是在指针数组索引的帮助下做出的。 因此,如果用户按下 0, ptrs[0]指向的函数将被调用,1 时, ptr[1]指向的函数将被调用。 但是由于没有检查来确保用户输入了 0/1,如果用户输入的不是 0 或 1,程序就会崩溃。

void on(Machine *m)
{
    cout << "   going from OFF to ON";
    m->setCurrent(new ON());    //Here you are changing the state of the machine from OFF to ON (Note: call comes to this function only if the previous state was OFF).
    delete this;                //The previous state instance (OFF state pointed by this pointer) of the machine is no more required. So you are deleting it.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM