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 Pattern - Fatal编程技术网

Java 访问者模式中元素的访问级别

Java 访问者模式中元素的访问级别,java,design-patterns,visitor-pattern,Java,Design Patterns,Visitor Pattern,在中,我希望客户端只能访问元素的getter,而访问者应该可以访问getter和setter。您将如何实施它 我不希望访问者和模型放在同一个包中(已经有很多类了)。 我正在考虑引入包含setter和accept方法的IWriteable接口。 有更好的办法吗 感谢天使O'Sphere: 该软件包将包含模型、访问者和工厂,所有这些都是2倍(接口和impl)。 我也有一些关于流氓程序员的想法,这就是为什么我问。 另一种办法是: public class ModelImpl implement IR

在中,我希望客户端只能访问元素的getter,而访问者应该可以访问getter和setter。您将如何实施它

我不希望访问者和模型放在同一个包中(已经有很多类了)。 我正在考虑引入包含setter和accept方法的IWriteable接口。 有更好的办法吗

感谢天使O'Sphere:

该软件包将包含模型、访问者和工厂,所有这些都是2倍(接口和impl)。 我也有一些关于流氓程序员的想法,这就是为什么我问。 另一种办法是:

public class ModelImpl implement IRead {
  @Override
  public Foo getFoo() {...}

  private void setFoo(Foo f) {...}

  public void accept(Visitor v) {
    v.visit(new ModelEditor());
  }

  private class ModelEditor implement IWrite {
    @Override
    public void setFoo(Foo f) {
      ModelImpl.this.setFoo(f);
    }
  }
}

但是这种方法有许多缺点,如果没有生成技术,会很麻烦:o

您最初的想法是:两个接口客户端(只读)和访问者(读/写)是标准的方法。类的数量不是将它们放入包或不放入包的理由。问题是逻辑上它属于哪里。我总是将遍历模型的访问者放入模型包中。然而,CPerkins是对的,两个接口是最直接的方法,但并不能使您免于流氓程序员的来回转换,例如,感谢CPerkins和Angel的回复。