Почему использование Шаблон "посетитель"? [дубликат]

вы можете проверить его с помощью простой проверки

obj == null || obj == String.Empty

Это проверит как нулевое, так и пустое условие

Спасибо

27
задан Community 23 May 2017 в 11:46
поделиться

5 ответов

Проблема возникает, когда у Вас есть сложная структура, т.е. иерархия или что-то еще, что это не просто линейно. Когда Вы не можете просто выполнить итерации по структуре, посетитель очень удобен.

, Если у меня есть иерархия (или дерево), каждый Узел имеет список детей. Когда я хочу применить процесс к каждому узлу в дереве, приятно создать Посетителя.

Узел А может тогда применить Посетителя себя и каждый из его дочерних Узлов. Каждый ребенок, transitively, делает то же (примените Посетителя себя и затем любых детей).

Это использование Посетителя удается очень приятно.

, Когда у Вас есть суперпростая структура данных, Посетитель не добавляет много значения.

49
ответ дан S.Lott 28 November 2019 в 04:33
поделиться

Шаблон "посетитель" является взломом для языков, которые не поддерживают, несколько диспетчеризируют непосредственно (язык как C++, и Java только поддерживают единственную отправку на основе объекта. Несколько диспетчеризируют, поддерживается CLOS). В этом случае, если Вы хотите, чтобы и счет и Клиент были полиморфными, необходимо будет использовать два интерфейса, BillVisitor и Клиента на единственных языках отправки. Например: реализация принимает, обычно:

void accept(BillVisitor visitor) { visitor.bill(this); } // java syntax

Уведомление здесь, и Customer#accept и BillVisitor#bill может быть переопределено их соответствующими подклассами, получающейся очень богатой комбинацией поведения во время выполнения, которое не может быть достигнуто иначе. Это - действительно надмножество того, что большинство других людей описало здесь как замену закрытия для применения функциональности к сложным структурам данных.

15
ответ дан Benjamin 28 November 2019 в 04:33
поделиться

Другая хорошая привилегия посетителей, их легко расширить, и если Ваш язык позволяет ее, можно даже использовать lamdbas для чистки вещей.

2
ответ дан Robert Gould 28 November 2019 в 04:33
поделиться

В моем приложении CAD/CAM у меня есть Пути и Наборы Путей (PathList). Иногда я должен генерировать набор форм. Не только я должен генерировать этот конкретный набор форм, я должен включать его с другим набором форм. Мне часто нужна дюжина или больше параметров для передачи всей информации, должен был сделать вычисления.

Все вычисления формы (простой или сложный) в моем CAM направляются PathList, который отослан в различные машины.

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

Посетитель Пути соответствует этому приятно. Каждое вычисление формы инкапсулируется в свой собственный класс со свойствами, столь же сложными как необходимое.

, Таким образом, Кухонный Посетитель Капота может, имел 8 форм к Pathlist

, В то время как Кухонный Посетитель Счетчика добавляет 6 форм.

Посетитель секции добавляет еще много.

Тогда я раздаю получающийся PathList к остальной части системы как любой другой генератор формы.

у меня легко есть опции, добавляя другого посетителя или не выполняя некоторых. Для парня, который только хочет счетчик и секции, я только должен выполнить двух посетителей.

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

, Кроме того, у меня теперь есть стандартизированный шаблон разработки, чтобы добавить любую новую функциональность к PathList путем реализации шаблона "посетитель".

, Например, это раньше было, что наш редактор свойств только работал над единственным путем. Когда мы изменились на редактирование разнообразных путей, было легко реализовать пользовательских посетителей, чтобы сделать глобальные изменения во всех путях. Это было более читаемо тогда использование для циклов в делегатах.

, Но в конечном счете это сводится к суждению и предпочтению.

3
ответ дан RS Conley 28 November 2019 в 04:33
поделиться

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

В основном в этом случае и случай упомянутый S.Lott, можно думать о посетителе как делегат. Это - функция, которую можно раздать как объект и использование при необходимости.

1
ответ дан Jacob Adams 28 November 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: