根据数据对象的专用类型确定数据对象的表示类?

我倾向于有一个类来描述一般概念和子类来描述该概念中的差异。例如,
Polygon
< | - {
Rectangle
Triangle
等}。 但是,我经常发现我对这些层次结构有各种各样的表示。例如,我想保持图形表示(例如,QPolygon),或物理表示(质量,centerOfMass)等与我拥有的另一个表示分开。 在我的例子中,我有一个纯数据对象的层次结构(
Command
< | - {
WaitCommand
UnknownCommand
等}},我有一个匹配的GUI表示每个数据类(
WaitCommandPanel
UnknownCommandPanel
)。 我的问题是,一旦我构造了数据表示,我需要从数据到GUI的跨越。 给定一个数据对象列表,我希望能够构造相应的GUI元素,但保持两个表示分开。 一个[糟糕的]解决方案是每个
Command
具有返回其GUI表示的能力(即,
Command::getPanel()
)。我不喜欢这个,因为我的数据类现在有代表性代码。 另一个解决方案(我暂时采用)是进行查找。也就是说,在启动GUI时,给定一个
Command
s列表(泛化),该函数根据其专用类型确定要创建的对象。我也不喜欢这个。 有什么建议?     
已邀请:
恕我直言,数据类没有任何渲染类都有责任决定哪个渲染器用于给定的数据对象。我更喜欢你的第二种选择。我通常使用将数据类型映射到渲染器类的映射。另请注意,此类映射是特定于上下文的(Web呈现将使用来自destop应用程序或健身上下文的不同呈现器)。 这种映射可以自动构建,例如使用属性(在.Net中)或可能是命名约定(在Lua中)。或者使用外部XML配置文件。 总结:有人必须做出这个决定,根据SRP,渲染器和数据对象都不应对此负责。这种逻辑是应用程序上下文特定的,因此应该在这些参与者(即渲染器和数据)之上。     
您可能希望使用控制反转(IoC)容器来构建类。 每个类都包含其关联类的接口。然后,IoC容器将根据您的配置将该类的实现注入到您的对象中。     

要回复问题请先登录注册