【问题标题】:null pattern and composite pattern don't play nice together空模式和复合模式不能很好地结合在一起
【发布时间】:2011-06-21 17:32:02
【问题描述】:

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

谢谢!

【问题讨论】:

  • 你的遍历函数是如何工作的?你需要以某种方式停止吗?您需要发布一些代码,因为您的问题似乎无效。
  • 我什至连搜索树的距离都不够。堆栈溢出发生在 NullNode 的构造过程中,因为它包含一个初始化为 NullNode 的父节点。
  • NullNode 当然应该没有父节点。使用伪代码查看下面的第二个答案。

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


【解决方案1】:

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

您的 NullNode 实际上不需要包含另一个 NullNode 作为父级。只需在 NullNode(或任何您所称的名称)中实现 getParent() 以返回 thisself 或您的语言中的任何含义。

但是,这可能仍然是一个坏主意,因为您确实必须在某个时候停止遍历。上面的代码让你通过了构造函数递归,但是树没有根,因为它一直是 NullNodes 或者是海龟一直向下或类似的东西。

如果您在代码不起作用的情况下实际展示代码,并稍微描述一下您的使用计划,这一切都会更容易讨论。

【讨论】:

    【解决方案2】:

    反例(极端伪代码):

    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();
     }
    

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      相关资源
      最近更新 更多