2015-12-30 1 views
5

Допустимо ли, что посетитель изменяет состояние объекта, в котором он работает? Эти действия не рассматриваются как анти-шаблоны?Шаблон посетителя: изменить состояние объекта?

+0

Поскольку посетитель работает с объектом, он может получить доступ к любым общедоступным методам и свойствам. Поэтому вам нужно установить требуемую инкапсуляцию объекта. Посетитель должен иметь возможность доступа к свойствам только для чтения, чтобы отображать что-либо или собирать информацию, а также изменять состояние объекта вызовом общедоступного метода, такого как MarkVisited() или Init(). Это похоже на полезную нагрузку для посетителя –

+0

Это полезно, если у вас нет исходного кода сторонних классов. Вы можете объявлять методы в Visitor и добавлять общую операцию, охватывая несколько связанных объектов. –

ответ

4

Совершенно нормально изменять объекты, которые были посещены.

Просто убедитесь, что ваш класс посетителя назван соответствующим образом, поэтому очевидно, что он имеет побочный эффект.

+1

Примером может быть посетитель, который посещает каждый узел (монстр, башню, что угодно) и поднимает их (я думаю об игре здесь). от 25% до 50%. Это действительный посетитель, который изменяет то, что он посещает. – mawalker

2

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

1

Как уже упоминалось в других ответах, во время его посещения нет анти-шаблона при мутации объекта; но, как и во всех изменяемых состояниях, следует соблюдать осторожность в многопоточных сценариях. Убедитесь, что ни один другой поток не мутирует объект одновременно с посетителем, а также обеспечивает правильную синхронизацию.