让我们想象一下,我有一组节点,我稍后会用于我的Renderer类.然后我有一个访问者类,可以访问节点或整个集合.这很简单,因为我的节点集合只是std :: list的包装器,只需要很少的额外方法.
问题是我希望节点(而不是简单列表)具有树状结构,因此节点可以有父节点和n个子节点.这将是方便的,因为我希望能够将一个节点传递给我的Renderer并将所有内容呈现在该节点的"下方".答案可能是复合材料.
我如何一起使用访客和复合?我已经读过它通常是一个很好的组合,但我的实现看起来很糟糕......我很想念......
我为我们的系统实现了非常类似的东西.我想要一种方法来组合几何对象的层次结构并将它们渲染到体积中.我使用复合模式来组成我的描述(根是Node,然后派生的子是compositeNode(节点列表).
CompositeNode有方法accept()接受访问者(访问者),然后在accept()内访问访问者 - >访问(this).
因此,您的访问者层次结构具有基类作为NodeVisitor和派生访问者,如RenderVisitor(呈现对象),ReportVisitor(将节点信息转储到文本中).您的基类需要接受基本和专用节点类型.
所以,是的,组合工作,我有工作代码,但我同意设计需要比你在网上阅读(Wiki或玩具示例)更多的努力.
希望这可以帮助