Покритикуйте реализацию паттерна State
От: syomin  
Дата: 24.12.07 08:23
Оценка:
Добрый день!

Столкнулся со сложностями в реализации паттерна 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);
        }
};


Внимание, вопрос: какие минусы в такой "конструкции"?

Лично мне не нравится, что для кода, выполняющего при входе (выходе) из состояния, используются отдельные методы, а не пара конструктор-деструктор.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.