1

我正在编写的库中有几个 C++ 中的“强相互依赖”类。第一个类是“DataSet”,和它的名字一样,管理数据。第二个类是“Renderer”,在 DataSet 中绘制数据。这两个类都是抽象的。这是我想要的两个类之间的“流程”:

  • 应用程序创建已实现的 DataSet 对象 (DataSetImpA,B,C) 并将它们传递给已实现的渲染器 (RendererImp)。

  • 应用程序告诉渲染器它的相机指向哪里。

  • 渲染器使用相机参数在每个 DataSet 上调用私有“更新”方法,以便 DataSet 准备所有相关对象。

  • 渲染器调用私有的“get”方法来检索新准备的对象。

  • Renderer 偶尔会调用私有的“clear”方法来销毁 DataSet 的对象。

'update'、'get' 和 'clear' 方法将是 DataSet 中的纯虚函数。朋友类在这里不起作用,因为我希望实现对使用 lib 的人是开放和可扩展的;当'class x'根据要使用的实现而变化时,期望有人写“friend class x”是不好的。

有人可以建议一种方法/设计模式来实现上述内容吗?随意提出不同的做事方式

4

2 回答 2

2

我不明白为什么updateget并且clear需要private。对我来说,这看起来是一个糟糕的设计。如果您打算从其他类调用它们,并且从逻辑上讲,它们应该从其他类调用,请将它们设为public. 事实上,我可能只是将update其设为私有并DataSet在需要时在内部调用它(例如,在 开头调用它get)。

您可以通过结交Renderer朋友并仅通过渲染器访问这些方法来按照您想要的方式进行操作,但是老实说,这看起来一点也不干净。

于 2013-01-04T11:00:17.590 回答
1

DataSet一个公共render函数,然后传递Renderer给它。

如果您需要更新独立于渲染,也请update公开。

A good design principle is Tell, Don't Ask. Don't write getters, rearrange your design so that they are not needed.

The name DataSet hides the true meaning of the objects. They are visible, renderable, scene objects, props, solids.

It sounds as though you want to render a particular view of a scene, depending upon the camera position. The view is dynamic:

View view(scene);    
...
view.render(renderer);
于 2013-01-04T11:09:34.360 回答