Образец шаблона Java вместо экземпляра switch

В этом question сказано, что я могу использовать шаблон посетителя вместо связки 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, которая может быть инициализирована через конструктор. Такой подход позволяет избежать необходимости реализации интерфейса для каждого элемента. [см. статью ниже, статья Jip-Tip 98]

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

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