基本上,所有类都是从称为Element的基类派生的,但是在任何给定时刻,结构都可以包含任何派生元素。

访问者应该以几种不同的样式打印元素,并实现接口ElementVisitor

是否可以在不指定访问者接口中所有派生类型的情况下实现访问者模式?

如果没有,鉴于ElementElementVisitor是框架级组件,我们应该可以随时扩展但不能随时进行编辑,那将是替代方案。

Element可以随时accept一个List<ElementVisitor>像这样:

class Element
{
    public void accept(List<ElementVisitor> actions) {
        foreach(ElementVisitor action : actions)
        {
            action.visit(this);
        }
    }
}


注意:该框架仍处于生产阶段,因此如果访客模式不允许这样做,则仍可以更改设计。

instanceof是解决此问题的唯一方法吗?我还能看什么其他选择?

最佳答案

如果要经常扩展操作,则访问者模式是一个不错的选择。但是,如果要经常扩展元素,则不是最佳选择。至少只要访问者需要具体元素的功能,这些功能就不会包含在元素的共同祖先中。

如果通过访问者实现的操作比元素类更稳定,那么最好将操作定义为由所有具体元素实现的祖先或接口中的抽象方法,而不是使用访问者模式。

关于java - 实现访问者模式而不在访问者界面中指定所有派生类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18351437/

10-10 18:24