基本上,所有类都派生自一个名为Element
的基类,但是在任何给定时刻,结构都可以包含任何派生元素。
访问者应该以几种不同的样式打印元素,并实现接口ElementVisitor
。
是否可以实现访问者模式而无需在访问者界面中指定所有派生类型?
如果没有,假设Element
和ElementVisitor
是我们应该可以随时扩展的框架级组件,那么会有什么替代方案,但不是随时编辑。
Element
可以随时accept
List<ElementVisitor>
如此:
class Element
{
public void accept(List<ElementVisitor> actions) {
foreach(ElementVisitor action : actions)
{
action.visit(this);
}
}
}
注意:框架仍处于生产阶段,因此如果访问者模式不允许,设计仍然可以更改。
instanceof
是解决这个问题的唯一方法吗?我能看到的其他替代方案是什么?
答案 0 :(得分:1)
如果要经常扩展操作,访问者模式是一个不错的选择。然而,如果要经常扩展元素,则不是最佳的。至少只要访问者需要未包含在元素的共同祖先中的具体元素的功能。
如果通过访问者实现的操作往往比元素类更稳定,那么最好将操作定义为祖先或接口中的抽象方法,这些抽象方法由所有具体元素实现,而不是使用访问者模式。