Я знаю и часто использую как итераторы, так и посетители, и использовал и то, и другое еще до того, как услышал о шаблонах проектирования Gang of Four. Хотя синтаксис этих двух шаблонов сильно различается, я использую оба для одной и той же концептуальной цели: обхода группы объектов. Грубо говоря, я использую итератор, когда у меня есть неструктурированные объекты одного типа, и я использую посетителя, когда у меня есть структурированные объекты разных типов. Для меня посетитель — это просто элегантный, причудливый и сильно типизированный итератор.
Когда я читал шаблоны проектирования, я обратил внимание на описание посетителей и особенно на то, как оно отличается от описания итератора.
Посетитель позволяет вам определить новую операцию без изменения классов элементов, над которыми она работает.
Итератор: предоставляет способ последовательного доступа к элементам агрегатного объекта, не раскрывая его базовое представление.
С тех пор я думал об этом и не могу понять, как посетитель определяет новую операцию.
Если я, например, хочу реализовать довольно простую операцию, например toLocalizedString()
в качестве локализованной альтернативы toString()
. Когда вы передаете посетителя элементу, он проходит через всю подструктуру этого объекта. Далее вы не можете ничего вернуть из методов accept/visit. Каждая из этих характеристик не позволяет мне использовать посетителя для определения toLocalizedString()
.
И в связи с этим у меня возникает вопрос: Как посетитель определяет новую операцию так, как это не делает итератор? Если верить описанию «Банды четырех», я чувствую, что упускаю самое главное. истинная сила шаблона посетителя.