Допустимо ли, что посетитель изменяет состояние объекта, в котором он работает? Эти действия не рассматриваются как анти-шаблоны?Шаблон посетителя: изменить состояние объекта?
ответ
Совершенно нормально изменять объекты, которые были посещены.
Просто убедитесь, что ваш класс посетителя назван соответствующим образом, поэтому очевидно, что он имеет побочный эффект.
Примером может быть посетитель, который посещает каждый узел (монстр, башню, что угодно) и поднимает их (я думаю об игре здесь). от 25% до 50%. Это действительный посетитель, который изменяет то, что он посещает. – mawalker
Пока посетитель использует только открытый интерфейс, и ни один из методов интерфейса не позволяет посетителю помещать объект в недопустимое состояние. Посетитель может изменять состояние посетившего объекта.
Как уже упоминалось в других ответах, во время его посещения нет анти-шаблона при мутации объекта; но, как и во всех изменяемых состояниях, следует соблюдать осторожность в многопоточных сценариях. Убедитесь, что ни один другой поток не мутирует объект одновременно с посетителем, а также обеспечивает правильную синхронизацию.
Поскольку посетитель работает с объектом, он может получить доступ к любым общедоступным методам и свойствам. Поэтому вам нужно установить требуемую инкапсуляцию объекта. Посетитель должен иметь возможность доступа к свойствам только для чтения, чтобы отображать что-либо или собирать информацию, а также изменять состояние объекта вызовом общедоступного метода, такого как MarkVisited() или Init(). Это похоже на полезную нагрузку для посетителя –
Это полезно, если у вас нет исходного кода сторонних классов. Вы можете объявлять методы в Visitor и добавлять общую операцию, охватывая несколько связанных объектов. –