我正在写一篇关于C ++的“强烈相互依赖”的课程。第一个类是“DataSet”,就像它的同名一样,管理数据。第二个类是“渲染器”,并在DataSet中绘制数据。这两个类都是抽象的。这是我想要的两个类之间的“流程”:
应用程序创建实现的DataSet对象(DataSetImpA,B,C)并将它们传递给实现的渲染器(RendererImp)。
应用程序告诉渲染器其摄像头指向的位置。
渲染器使用摄像头参数在每个DataSet上调用私有'update'方法,以便DataSet准备所有相关对象。
Renderer调用私有的“get”方法来检索新准备的对象。
Renderer偶尔会调用一个私有的'clear'方法来销毁DataSet的对象。
'update','get'和'clear'方法将是DataSet中的纯虚函数。朋友类在这里不起作用,因为我希望实现对于使用lib的人来说是开放和可扩展的;当'class x'根据要使用的实现而变化时,期望有人写“朋友类x”是不好的。
有人可以建议一种方法/设计模式来实现类似上面的内容吗?随意提出一种不同的做事方式
答案 0 :(得分:2)
我不明白为什么update
,get
和clear
需要private
。对我来说,这看起来像一个糟糕的设计。如果您计划从其他类调用它们,并且逻辑上应该从其他类调用它们,请将它们设为public
。事实上,我可能只是将update
设为私有,并在需要时从DataSet
内部调用它(例如,在get
的开头调用它。)
你可以通过让Renderer
成为朋友,并通过渲染器访问这些方法来实现你想要的方式,但是,说实话,这看起来并不干净。
答案 1 :(得分:1)
授予DataSet
公开render
功能,并将Renderer
传递给它。
如果您需要将更新与渲染无关,请将update
公开。
一个好的设计原则是Tell, Don't Ask。不要写吸气剂,重新安排你的设计,以便不需要它们。
名称DataSet
隐藏了对象的真实含义。它们是可见的,可渲染的,场景对象,道具,实体。
听起来好像要根据相机位置渲染场景的特定视图。视图是动态的:
View view(scene);
...
view.render(renderer);