null模式和复合模式不能很好地结合在一起

时间:2011-06-21 17:32:02

标签: design-patterns composite null-object-pattern

在这个复合树中,我保留了对父节点的引用以进行灵活的树遍历。我不想一直检查父引用的空引用但是如果我创建一个NullNode类并初始化每个节点的父代,我得到一个堆栈溢出,因为NullNode有一个NullNode有一个NullNode有一个.. ..无限的 我已经尝试将NullNode的父级设置为null但是我仍然必须对父级进行空引用检查,这似乎是为了破坏目的。 有人碰到这个吗?什么,如果有什么可以做的?

谢谢!

2 个答案:

答案 0 :(得分:1)

计数器示例(极端伪代码):

class NullNode(): Component{
   public NullNode(){

   }
    public something SearchUp(){
       return null;
    }
}

class Node: Component{
   public Node(t){
       this.parent = NullNode();
   }
    public void SetParent(Component parent){
       this.parent = parent;
    }
    public something SearchUp(){
      return self.parent.SearchUp();
    }
  }

abstract class Component{
    Component parent

    public Component(){
    }
    public something SearchUp();
 }

答案 1 :(得分:1)

  

如果我创建一个NullNode类并初始化每个节点的父节点,我得到一个堆栈溢出,因为NullNode有一个NullNode有一个NullNode有一个.... ad无限我尝试将NullNode的父节点设置为null但是然后我仍然需要对父母进行空引用检查,这似乎打败了目的。有人碰到这个吗?

您的NullNode不需要将另一个NullNode实际包含为父级。只需在getParent()(或您正在调用的任何内容)中实施NullNode即可返回thisself或以您的语言提供的任何方式。

然而,这可能仍然是一个坏主意,因为你必须在某个时候停止遍历。上面的命令会让你通过构造函数的递归,但是树没有根,因为它的NullNodes一直都是NullNodes或者乌龟一直都是这样的。

如果您实际显示代码,即使它不起作用,也会更容易讨论,并描述您的使用计划。