实现访问者模式而不在访问者界面中指定所有派生类型

时间:2013-08-21 07:35:05

标签: java design-patterns visitor

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

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

是否可以实现访问者模式而无需在访问者界面中指定所有派生类型?

如果没有,假设ElementElementVisitor是我们应该可以随时扩展的框架级组件,那么会有什么替代方案,但不是随时编辑

Element可以随时accept List<ElementVisitor>如此:

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

注意:框架仍处于生产阶段,因此如果访问者模式不允许,设计仍然可以更改。

instanceof是解决这个问题的唯一方法吗?我能看到的其他替代方案是什么?

1 个答案:

答案 0 :(得分:1)

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

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