我今天正在用访客模式做一些功课,并且造就了一个看起来像这样的访客(来自wikipedia的编辑示例代码):

class CarElementPrintVisitor implements CarElementVisitor {
    public void visit(CarElement element) {
        if (element.getClass() == Wheel.class)
        {
            return visit((Wheel)element);
        }
        else if (element.getClass() == Engine.class)
        {
            return visit((Engine)element);
        }
        else if (element.getClass() == Body.class)
        {
            return visit((Body)element);
        }
        else //if (v.getClass() == Car car.class)
        {
            return visit((Car)element);
        }
    }

    public void visit(Wheel wheel) {
        System.out.println("Visiting " + wheel.getName() + " wheel");
    }

    public void visit(Engine engine) {
        System.out.println("Visiting engine");
    }

    public void visit(Body body) {
        System.out.println("Visiting body");
    }

    public void visit(Car car) {
        System.out.println("Visiting car");
    }
}


“ public void visit(CarElement element)”方法有点丑陋(很长(如果添加更多的CarElements,则需要维护),但是我想保留该方法,因此我尝试做得更好。

我最终尝试了这个:

    public void visit(CarElement element) {
        return visit(element.getClass().cast(element));
    }


但是,即使element.getClass()返回正确的类,它也只会返回“ visit(CarElement element)”,因此最终会陷入无限循环。

有谁知道该怎么办,我想做什么? (如果有可能,我不确定)。

最佳答案

您错过了使访问者模式更漂亮的原因:accept(CarElementVisitor)方法必须在CarElement接口中,并且使用适当的类型将访问者自身回调。重新阅读维基百科文章。

07-26 09:28