如何解耦小部件的模型/视图

时间:2009-09-12 04:07:23

标签: design-patterns model model-view-controller

我正在编写一个应用程序,用于绘制小部件/菜单/控件等以创建应用程序模型。每个屏幕都表示为小部件的集合,每个小部件都是简单的类,例如。

class Model(object):
    def __init__(self):
        self.widgets = []

class Widget(object):
    def __init__(self):
        self.x, self.y = 0, 0
        self.w, self.h = 100,20
        self.text = "Widget"

现在用户可以在编辑器中编辑x,y,w,h并在多个视图(地点)中进行渲染,渲染本身可能会改变w和h,因为我们希望至少显示最佳拟合。 例如文本“Widget”在不同视图中可能需要宽度为200或205

问题:

所以问题是渲染/视图本身修改了模型,如何避免这种情况?现在我有主视图和主模型,任何其他视图,如果想渲染副本模型并渲染它,从而避免主模型的变化。

这种方法很简单,代码仍然很简单,但需要一个不必要的模型副本,我已经想到了许多方法来避免这种情况,但是所有这些都会使代码复杂化并且可能效率不高,因为无论如何模型都不会被复制渲染时间 - 属性需要放在某处,例如在每个小部件的每个渲染器中。

我在python中实现它,但这与答案无关。

1 个答案:

答案 0 :(得分:2)

如果模型中渲染更改的唯一内容是x,y,w,h,那么您有几个选项:

  1. 复制这些字段:x,y,w,h和x_drawn,y_drawn等。渲染可以更改_drawn值,并使模型不会介意它们已更改。例如,在保存模型时,请不要保存_drawn值。然后模型可以在渲染过程中改变,但无关紧要。

  2. 将x,y,w,h移动到RenderedGeometry类中,并为每个模型提供一个实例。现在你仍然可以复制模型,但它可以是浅拷贝,加上RenderedGeometry类的新副本,减少你必须复制的数量。

  3. 将字段复制到x_original,y_original字段集中。在渲染之前,将x,y复制到_original字段中。渲染后,将它们复制回来。模型实例本身不必复制,只需要复制少量数据。