Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在不指定访问者接口中的所有派生类型的情况下实现访问者模式?_Java_Design Patterns_Visitor - Fatal编程技术网

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

Java 在不指定访问者接口中的所有派生类型的情况下实现访问者模式?,java,design-patterns,visitor,Java,Design Patterns,Visitor,基本上,所有类都从名为Element的基类派生,但是在任何给定时刻,结构都可能包含任何派生元素 访问者应该以几种不同的样式打印元素,并实现接口ElementVisitor 是否可以在不指定访问者接口中的所有派生类型的情况下实现访问者模式 如果不是,考虑到Element和ElementVisitor是框架级组件,我们应该能够在任何时候扩展,但不能在任何时候编辑,还有什么替代方案呢 元素可以随时接受列表如下: class Element { public void accept(List&l

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

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

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

如果不是,考虑到
Element
ElementVisitor
是框架级组件,我们应该能够在任何时候扩展,但不能在任何时候编辑,还有什么替代方案呢

元素
可以随时
接受
列表
如下:

class Element
{
    public void accept(List<ElementVisitor> actions) {
        foreach(ElementVisitor action : actions)
        {
            action.visit(this);
        }
    }
}
类元素
{
公共作废接受(列出操作){
foreach(ElementVisitor操作:操作)
{
行动.访问(本);
}
}
}
注意:框架仍处于生产阶段,因此如果访问者模式不允许,设计仍可以更改


instanceof
是解决这个问题的唯一方法吗?我还可以考虑哪些其他选择?

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


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

你说的“以几种不同的样式打印元素”是什么意思,元素中有数据,每个访问者只打印与之相关的数据。