代码之家  ›  专栏  ›  技术社区  ›  Nazgob

迭代节点层次结构——访问者和复合者?

  •  8
  • Nazgob  · 技术社区  · 17 年前

    让我们想象一下,我有一个节点集合,稍后用于渲染器类。然后,我有了一个可以访问节点或整个集合的Visitor类。这很简单,因为我的节点集合只是std::list的包装器,只有很少的额外方法。

    我如何同时使用Visitor和Composite?我读过,它通常是一个很好的组合,但我的实现看起来很糟糕。..我错过了什么。

    3 回复  |  直到 15 年前
        1
  •  5
  •   Ketan    17 年前

    我为我们的系统实施了非常类似的东西。我想要一种方法来组合几何对象的层次结构,并将其渲染到体积中。我使用复合模式来编写我的描述(根是Node,然后派生的子是compositeNode(节点列表)。

    CompositeNode具有accept()方法,该方法接受访问者(visitor),然后在accept(;访问(此)。

        2
  •  3
  •   Andreas Magnusson    17 年前

    这里有一个简单的例子:

    struct NodeVisitor;
    
    struct Node
    {
      virtual ~Node() {}
      virtual void accept(NodeVisitor &v);
    };
    
    struct CompositeNode : public Node
    {
      virtual void accept(NodeVisitor &v);
      std::list<NodePtr> nodes_;
    };
    
    struct NodeVisitor
    {
      virtual ~NodeVisitor() {}
      virtual void visit(Node &n) = 0;
      virtual void visit(CompositeNode &cn)
      {
        for(std::list<NodePtr>::iterator it = cn.nodes_.begin(), end = cn.nodes_.end(); it != end; ++it)
        {
          (*it)->accept(*this);
        }
      }
    };
    
        3
  •  1
  •   Christian Jung    13 年前

    如果你想让你的访问者也知道树的结构(例如,它正在访问的深度或从树根开始的路径),你可以考虑使用分层访问者模式。 c2.com wiki

    它还展示了如何跳过“无趣”的分支。