Шаблон посетителя Java, когда тип посетителя зависит от типа посетителя - PullRequest
1 голос
/ 26 июля 2011

Я пытаюсь найти правильный подход (и схему), который требует моя текущая проблема.Все, кажется, ведет меня к шаблону посетителя, и пример из Википедии - почти то, что мне нужно.Однако моя проблема в том, что я извлекаю эти 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);
    }
}

1 Ответ

1 голос
/ 26 июля 2011

Хотелось бы что-нибудь подобное?

class FindTheRightVisitorVisitor implements CarElementVisitor {
    private CarElementVisitor theVisitor;
    ... getter etc ...
    void visit(Windshield w) {
        if (theVisitors == null) {
            theVisitors = new CarElementWashVisitor();
        }
    }
}

И использовать здесь:

CarElement root = ...;
CarElementVisitor findIt = new FindTheRightVisitorVisitor();
root.accept(findIt);
CarElementVisitor theRightVisitor = findIt.getTheVisitor();
root.accept(theRightVisitor);
...