Альтернатива шаблону посетителя

Известная проблема с Visitor Pattern - это то, что он плохо масштабируется с богатой иерархией классов (даже если вы не часто добавляете классы).

Когда вы объединяете шаблон посетителя с шаблоном команды, открываются врата ада. Ваш интерфейс посетителя теперь должен поддерживать все типы вашей иерархии, которые могут быть нежелательны.

Например, вы можете разделить ваши команды на категории:

class CarCommands
{
protected:
        enum TypeOfCommands : uint8_t
        {
                RadioCommands,
                EngineCommands,
                WindowsCommands,

                MaxCarCommands
        };

        uint8_t cmd_type;
};

Оттуда вы пишете свои классы:

class RadioCmd : CarCommands
{
public:
    RadioCmd() : CarCommands(RadioCommands)
    {}

    // Other radio-specific methods
    ...
    // Other radio-specific data members
    ...
protected:
    enum TypeOfRadioCmd : uint8_t
    {
        Radio_ON,
        Radio_OFF,

        MaxRadioType
    };

    uint8_t radio_type;
};

class EngineCmd : CarCommands
{
pubilc:
    EngineCmd() : CarCommands(EngineCommands)
    {}
protected:
    enum TypeOfEngineCmd : uint8_t
    {
        Engine_Start,
        Engine_Accelerate,
        Engine_Stop,

        MaxEngineType
    };

    uint8_t engine_type;
};

Естественно иметь обработчик для каждой категории. Если я захочу обработать связанные с Engine команды, мой EngineCommandHandler не должен знать о других типах CarCommands, Таким образом, если я решу добавить еще одну команду двигателя, мне нужно будет только изменить EngineCommandHandler чтобы поддержать это. В то же время CarCommandHandler должен уметь правильно обрабатывать AccelerateEngine команда.

Есть ли альтернатива для шаблона посетителя, который масштабируется с большой иерархией классов? Учитывая проблему, есть ли другой шаблон дизайна, который применяется лучше, чем шаблон посетителя?

0 ответов

Другие вопросы по тегам