Хотя это не тот ответ, который вы ищете: рассмотрите возможность использования языка более высокого уровня, менее подробного, чем Java.Вы обнаружите, что такие вещи, как шаблон посетителя, начинают казаться неактуальными.Конечно, если вы хотите определить логику для обхода структуры данных в одном месте, и определить, что делать с элементами структуры данных (на основе их типов) где-то еще, и сделать возможным смешивать и сопоставлять обход/ стратегии обработки, вы можете сделать это.Но вы можете сделать это с помощью небольшого количества простого кода, ничего такого, что вы могли бы назвать «шаблоном».
Я пришел из C / Java программирования и начал изучать различные динамические языки несколько лет.тому назад.Было невероятно понять, как много вы можете сделать в нескольких строках кода.
Например, если бы я должен был эмулировать шаблон Visitor в Ruby:
module Enumerable
def accept_visitor(visitor)
each do |elem|
method = "visit#{elem.class}".to_sym
elem.send(method,elem) if elem.respond_to? method
end
end
end
Объяснить: в Ruby Enumerable представляет все, что может быть повторено.В этих 8 строках кода я создал каждый вид объекта, который можно повторять для принятия посетителей.Планирую ли я, чтобы 5, 10 или 100 различных классов принимали Посетителей, эти 8 строк - все, что нужно.
Вот пример посетителя:
class CatCounter
attr_reader :count
def initialize; @count = 0; end
def visitCat; @count += 1; end
end
Обратите внимание, что посетительНе нужно определять методы для all различных типов Visitable.Каждый посетитель просто должен определить методы для типов Visitable, которые его интересуют;он может игнорировать все остальное.(Это означает, что вам не нужно изменять кучу существующего кода, если вы добавляете новый тип Visitable.) И любой посетитель может взаимодействовать с любым объектом, который принимает посетителей.
Только в этих нескольких строках кода все проблемы, которые вы упомянули в шаблоне Visitor, были преодолены.
Не поймите меня неправильно;Ява - отличный язык для некоторых вещей.Но вам нужно выбрать правильный инструмент для работы.Тот факт, что вы так много боретесь, чтобы преодолеть ограничения своего инструмента, может указывать на то, что в этом случае требуется другой инструмент.