Я ищу альтернативу шаблону посетителя. Позвольте мне сосредоточиться на нескольких важных аспектах шаблона, пропуская неважные детали. Я буду использовать пример формы (извините!):
- У вас есть иерархия объектов, реализующих интерфейс IShape
- У вас есть несколько глобальных операций, которые должны выполняться для всех объектов в иерархии, например. Draw, WriteToXml и т.д.
- Заманчиво погрузиться прямо и добавить метод Draw() и WriteToXml() в интерфейс IShape. Это не обязательно хорошо - всякий раз, когда вы хотите добавить новую операцию, которая должна быть выполнена для всех фигур, каждый класс, полученный из IShape, должен быть изменен.
- Реализация посетителя для каждой операции, то есть посетитель Draw или посетитель WirteToXml инкапсулирует весь код для этой операции в один класс. Добавление новой операции - это вопрос создания нового класса посетителей, который выполняет операцию для всех типов IShape
- Когда вам нужно добавить новый класс, основанный на IShape, у вас по существу будет такая же проблема, как и в 3 - все классы посетителя должны быть изменены, чтобы добавить метод для обработки нового типа, полученного из IShape
В большинстве мест, где вы читаете о шаблоне посетителя, укажите, что точка 5 в значительной степени является основным критерием для работы шаблона, и я полностью согласен. Если число классов, полученных из IShape, является фиксированным, это может быть довольно изящным подходом.
Таким образом, проблема заключается в том, что добавляется новый класс, основанный на IShape - каждая реализация посетителя должна добавить новый метод для обработки этого класса. Это, в лучшем случае, неприятно и, в худшем случае, невозможно и показывает, что эта схема не предназначена для того, чтобы справляться с такими изменениями.
Итак, вопрос в том, кто-нибудь сталкивается с альтернативными подходами к решению этой ситуации?