Добрый день!
Столкнулся со сложностями в реализации паттерна State. GoF читал, но просветления не пришло, поэтому решил обратиться к местным гуру за помощью.
Есть класс Device, поведение которого сильно зависит от его состояния. Интерфейс у класса следующий:
class Device {
public:
void poll();
void process_command(const Command *command);
};
Само-собой напрашивается паттерн State. Взвесив все за и против, решил хранить данные, связанные с конкретным состоянием, в классе Device, а класс State сделать синглтоном. Задача усложняется тем, что при попадании в некоторое состояние и при выходе из него нужно выполнять определенные действия, поэтому в State добавляются методы entry() и exit().
class Device {
public:
void poll() { state_->poll(*this); }
void process_command(const Command *command) { state_->process_command(*this, command); }
private:
class State {
virtual void entry(Device &device);
virtual void exit(Device &device);
virtual void poll(Device &device);
virtual void process_command(Device &device, const Command *command);
};
// Состояния устройства.
class Ready;
class Steady;
class Go;
const State *state_;
// Сменить состояние.
void change_state(State *state)
{
state_->exit(*this);
state_ = state;
state_->entry(*this);
}
};
Внимание, вопрос: какие минусы в такой "конструкции"?
Лично мне не нравится, что для кода, выполняющего при входе (выходе) из состояния, используются отдельные методы, а не пара конструктор-деструктор.