在这种情况下,我应该使用什么样的设计



我是设计软件的新手,我正在尝试构建一个树状结构
我有一个像这样的空接口:

interface Node{
}

NodeANodeB两个类实现了这个接口,并且都有一些特定的属性。除了这些是节点之外,它们没有任何共同之处。

class A implements Node {
public String a;
public A(String a){
this.a = a;
}
}
class B implements Node {
public int a = 5;
public String z = "xyz";
public B(int a,String z){
this.a = a;
this.z = z;
}
}

我有一个class Parse,它根据特定条件创建上述类的实例。

class Parse {
List<Boolean> l;
private static int i=0;
Parse(List<Boolean> l){
this.l = l;
}
private Node parseA() {
return new A(/* param */); // Assume some parameters here
}
private Node parseB() {
return new B(/* param */); // Assume some parameters here
}
private boolean getNextState(){
return l.get(i++);
}
public Node parse(){
boolean x = getNextState();
if(x){
return parseA();
}
else{
return parseB();
}
}
}

驾驶员等级:

public class Test {
public static void main(String[] args) {
List<Boolean> l = Arrays.asList(true,false); // so on...
Parse p = new Parse(l);
Node b = p.parse();  // not sure if its NodeA or NodeB
}
}

在构建了树之后,我计划使用访问者模式来检索一些属性并进行一些操作。

所以最后,当我得到一个Node b时,我想访问它的属性(NodeANodeB(,我知道这不能作为多态性这样工作

我认为使用instanceof梯形图和类型转换并不是正确的解决方案。
很抱歉出现这个愚蠢的问题,但作为设计新手,我不知道下一步该怎么办

如何解决这个设计问题?任何人都可以为此共享一个小的设计结构吗?假设这个结构会变得更大,并有足够的不同节点。[此处可能是Java Generics的帮助]

注意:更改上面的设计是可以的,但如果可能的话,可以提供一个小样本代码。

正如您所提到的,访问者模式可以在这里使用。

interface Node {
<T> T accept(NodeVisitor<T> visitor);
}
class A implements Node {
public String a;
public A(String a){
this.a = a;
}
@Override
public <T> T accept(NodeVisitor<T> visitor) {
return visitor.visit(this);
}
}
class B implements Node {
public int a = 5;
public String z = "xyz";
public B(int a,String z){
this.a = a;
this.z = z;
}
@Override
public <T> T accept(NodeVisitor<T> visitor) {
return visitor.visit(this);
}
}
interface NodeVisitor<T> {
T visit(A node);
T visit(B node);
}

然后通过实现相应的访问者来定义特定的操作:

NodeVisitor<Integer> visitor = new NodeVisitor<Integer>() {
@Override
public Integer visit(A node) {
// TODO do something with A node
return null;
}
@Override
public Integer visit(B node) {
// TODO do something with B node
return null;
}
};

只需呼叫接受:

Node node = ...;
Integer result = node.accept(visitor);

这个答案在很大程度上取决于您在本节中所做的操作:

所以最后,当我得到一个节点b时,我想访问它的属性(NodeA或NodeB(,我知道这是不可能的,因为多态性不起作用那样。

就我个人而言,我建议您使用策略模式。这样做的目的是有一个通用的方法,比如visit(它可以驻留在Node接口中,甚至可以创建一个IVisitable接口(或者类似的东西(。此方法的目的是处理算法的访问方面。

因此,从本质上讲,您将委托访问节点时发生的事情。如果您需要做一些特定的事情,那么让这个方法将visitor作为方法参数可能是有意义的,这样您的访问者就可以对节点本身的内容进行操作。

相关内容

  • 没有找到相关文章

最新更新