Я пытаюсь найти правильный подход (и схему), который требует моя текущая проблема.Все, кажется, ведет меня к шаблону посетителя, и пример из Википедии - почти то, что мне нужно.Однако моя проблема в том, что я извлекаю эти CarElement
из базы данных и мне нужно создать правильного посетителя в зависимости от типа CarElement
s, который я запрашивал.Например, если я получил список Windshield
s, я хочу передать CarElementWashVisitor
.Такое ощущение, что я иду против шаблона здесь, но я не уверен, что правильный подход без проверки типа подкласса.Мне в основном нужен какой-то способ выяснить, что делать, основываясь на типе времени выполнения объекта (ов).Вот краткая часть примера википедии, на который я ссылался выше:
interface CarElementVisitor {
void visit(Wheel wheel);
void visit(Engine engine);
void visit(Body body);
void visit(Car car);
}
interface CarElement {
void accept(CarElementVisitor visitor); // CarElements have to provide accept().
}
class CarElementPrintVisitor implements CarElementVisitor { /**/ }
class CarElementDoVisitor implements CarElementVisitor { /**/ }
ОБНОВЛЕНИЕ:
Оказывается, что проблема на самом деле довольно простая (как показанопринятый ответ ниже).Вот что я искал:
class MyVisitor implements CarElementVisitor {
private MyService carwashService;
/* visit(Wheel w), visit(Engine e)... etc */
void visit(Windshield w) {
carwashService.wash(w);
}
}