Шаблон посетителя Java вместо экземпляра instanceof
В этом вопросе сказано, что я могу использовать шаблон посетителей вместо группы instanceof
s. Jmg сказал: "Если вы не можете изменить A, B и C, вы можете применить шаблон посетителя для достижения того же".
Насколько я понимаю, мне все еще нужно сделать так, чтобы посетители поддержки A, B и C (имели accept()
метод, например).
Моя проблема в том, что у меня нет абсолютно никакой возможности изменить A, B и C. Я просто получаю объект Car из иностранной библиотеки и должен вызвать wash()
метод, специфичный для грузовых автомобилей, гоночных автомобилей и автобусов.
Я думаю, что мне все еще нужно if-else-if
строительство с instanceof
s. Я прав?
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 на вашем месте.