Шаблон посетителя Java вместо экземпляра instanceof

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

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

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

Я думаю, что мне все еще нужно if-else-ifстроительство с instanceofs. Я прав?

1 ответ

Решение

Да, для реализации шаблона посетителя теперь вам нужен доступ к источнику 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 на вашем месте.

Другие вопросы по тегам