Шаблон посетителя Java вместо экземпляра instanceof - PullRequest
10 голосов
/ 20 декабря 2011

В этом вопросе сказано, что я могу использовать шаблон посетителя вместо набора instanceof с. Jmg сказал: «Если вы не можете изменить A, B и C, вы можете применить шаблон посетителя для достижения того же».

Насколько я понимаю, мне все еще нужно сделать так, чтобы посетители поддержки A, B и C (например, имели метод accept()).

Моя проблема в том, что у меня нет абсолютно никакой возможности изменить A, B и C. Я просто получаю объект Car из иностранной библиотеки и должен вызвать wash() метод, специфичный для грузовых автомобилей, гоночных автомобилей и автобусов.

Я думаю, мне все еще нужна конструкция if-else-if с instanceof с. Я прав?

1 Ответ

10 голосов
/ 20 декабря 2011

Да, для реализации шаблона посетителя теперь вам нужен доступ к источнику A, B и C, если только все классы не имеют одинаковую сигнатуру (поэтому у всех есть метод wash () с одинаковым именем).В этом случае вы можете использовать полиморфизм для вызова правильного метода.

В противном случае возможно добавить функциональность в классы, к которым у вас нет доступа на уровне исходного кода.В статье в Википедии о шаблоне посетителя (http://en.wikipedia.org/wiki/Visitor_pattern) ниже примера Java есть небольшая сноска:

Примечание. Более гибкий подход к этому шаблону состоит в создании класса-оболочки, реализующего интерфейс, определяющийметод accept. Оболочка содержит ссылку, указывающую на CarElement, который можно инициализировать с помощью конструктора. Этот подход позволяет избежать необходимости реализации интерфейса для каждого элемента. [см. статью Java Tip 98, статья ниже]

Это ссылается на эту статью: http://www.javaworld.com/javaworld/javatips/jw-javatip98.html

Итак, в целом это возможно, но это дает огромное количество классов для небольшой задачи, которую вы хотите выполнить. Я бы придерживался instanceof, если бы я былвы.

...