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

Design patterns 根据数据对象的专用类型确定其表示类?,design-patterns,oop,code-separation,Design Patterns,Oop,Code Separation,我倾向于用一个类来描述一个一般概念,用子类来描述这个概念中的差异。例如,PolygonIMHO,无论是数据类还是渲染类都没有责任决定对给定数据对象使用哪个渲染器。我更喜欢你的第二个选择。我通常使用将数据类型映射到渲染器类的映射。还要注意,这种映射是特定于上下文的(web渲染将使用来自destop应用程序或适应上下文的不同渲染器) 这种映射可以自动构造,例如使用属性(在.Net中)或命名约定(在Lua中)。或者使用外部XML配置文件 小结:必须有人做出决定,根据SRP,渲染器和数据对象都不应对此负

我倾向于用一个类来描述一个一般概念,用子类来描述这个概念中的差异。例如,
Polygon
IMHO,无论是数据类还是渲染类都没有责任决定对给定数据对象使用哪个渲染器。我更喜欢你的第二个选择。我通常使用将数据类型映射到渲染器类的映射。还要注意,这种映射是特定于上下文的(web渲染将使用来自destop应用程序或适应上下文的不同渲染器)

这种映射可以自动构造,例如使用属性(在.Net中)或命名约定(在Lua中)。或者使用外部XML配置文件


小结:必须有人做出决定,根据SRP,渲染器和数据对象都不应对此负责。此类逻辑是特定于应用程序上下文的,因此应该“高于”这两个参与者(即渲染器和数据)。

您可能希望研究使用控制反转(IoC)容器来构建类


每个类将包含其关联类的接口。然后,IoC容器将根据您的配置方式将该类的实现注入到您的对象中

我已经用Matryoshka玩偶了我的GUI(主窗口有项目面板,项目面板有命令面板等等),每个级别都不知道它嵌套在哪里/上面的级别。但是,每个级别都知道下面的级别(这是较低级别存在的上下文),我想我将把它留给使用面板来决定的级别。我不需要任何花哨的XML,因为类的配对不会改变(
X
将始终使用
XPanel
作为GUI表示)。此外,在python中使用字典(type(X)=>XPanel的构造函数)很容易将其关联起来。谢谢。特别是对于Python,您可以使用命名约定来进行关联。遍历范围并填充渲染器查找映射,以便将任何形式(?.*)渲染器类注册为:type(obj)=>type(objRenderer)。因此,您只需要定义MyData和MyDataRenderer类,它们就会自动关联起来。(我认为这种方法很酷,但不实用——会带来比解决问题更多的问题)