2013-01-04 135 views
1

我在写一个lib的C++中有几个'强烈依赖'的类。第一类是“数据集”,就像它的名字一样,管理数据。第二类是“渲染器”并在DataSet中绘制数据。这两个类都是抽象的。下面是两个类之间的“流”我想:C++设计模式帮助;抽象类与私人访问?

  • 应用程序创建实现DataSet对象(DataSetImpA,B,C),并将其传递到执行渲染(RendererImp)。

  • 该应用程序告诉渲染器摄像头指向哪里。

  • Renderer使用相机参数在每个DataSet上调用一个私有'update'方法,以便DataSet准备所有的relavent对象。

  • Renderer调用私有'get'方法来检索新准备的对象。

  • 渲染程序偶尔会调用私有的“清除”方法来销毁DataSet的对象。

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

有人可能会建议一种方法/设计模式来实现类似上面的东西?随意建议做的事情以及

+0

不要让你的'update','get'和'clear'方法'private',使它们成为'public'。记录他们说他们是为了供Renderer使用。 – piokuc

回答

2

我不明白为什么updategetclear必须private不同的方式。对我而言,这看起来像一个糟糕的设计。如果您计划从其他课程中调用他们,并且从逻辑上讲,他们应该从其他课程中调用,使其成为public。事实上,我可能只需要update私人,并在需要时从DataSet内部调用它(例如,在get的开头称它)。

你可以按照你想要的方式做Renderer一个朋友,并通过渲染器访问这些方法,但说实话,这看起来并不干净。

+0

好吧,我对使用朋友类和专门将方法标记为“不适合一般用途”的所有负面反馈之间有点撕裂。对我来说,公共意味着你可以随时使用它们,而在我的情况下,只有在渲染器中使用它们才有意义。也许我只是偏执狂。 – Prismatic

1

DataSet公开render函数,并将其传递给它render函数,并将Renderer传递给它。

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

一个好的设计原则是Tell, Don't Ask。不要写吸气剂,重新排列你的设计,以免它们被需要。

名称DataSet隐藏了对象的真实含义。它们是可见的,可渲染的,场景对象,道具,实体。

听起来好像您要呈现场景的特定视图,具体取决于相机的位置。视图是动态的:

View view(scene);  
... 
view.render(renderer);