c++ - 节点的迭代层次结构 - 访客和复合?

标签 c++ oop design-patterns composite visitor-pattern

让我们假设我有一个节点集合,我稍后会在我的渲染器类中使用这些节点。然后我有一个可以访问节点或整个集合的访问者类。这很简单,因为我的节点集合只是 std::list 的包装器,几乎没有额外的方法。

问题是我希望节点有一个树状结构(而不​​是简单的列表),这样一个节点可以有一个父节点和 n 个子节点。这将很方便,因为我希望能够将一个节点传递给我的渲染器并渲染该节点“下方”的所有内容。答案可能是 Composite。

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

最佳答案

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

CompositeNode 有接受访问者 (Visitor) 的方法 accept(),然后在 accept() 中执行 visitor->visit(this)。

因此,您的访问者层次结构具有基类 NodeVisitor 和派生访问者,例如 RenderVisitor(呈现对象)、ReportVisitor(将节点信息转储到文本中)。您的基类将需要接受基本和专用节点类型。

所以是的,组合有效,我有工作代码,但我同意设计比您在网上阅读的内容(Wiki 或玩具示例)需要更多的努力。

希望对你有帮助

关于c++ - 节点的迭代层次结构 - 访客和复合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/538856/

相关文章:

c++ - klocwork CWARN.SIGNEDBIT on unsigned char

java - 如何设计日历

c++ - 在这种情况下如何传递成员函数而不是函数?

Python:如何用一些已知的值初始化 OOP 列表?

css - 根据条件更改图标的颜色

c++ - 使用 cpp_int 构建一个大的 boost unordered_map

java - 在 Javacv 中传递 Point2f [] 作为 getAffineTransform() 的参数

c++ - "indirectly declaring a namespace within another namespace"是什么意思?

design-patterns - 在 Stylus/Sass 中编写多个主题的设计模式?

c# - 哪些是 C# 原生内置设计模式?