Альтернатива шаблону посетителя
Известная проблема с 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
команда.
Есть ли альтернатива для шаблона посетителя, который масштабируется с большой иерархией классов? Учитывая проблему, есть ли другой шаблон дизайна, который применяется лучше, чем шаблон посетителя?