gui应用的面向对象设计问题

时间:2010-10-01 11:21:45

标签: python user-interface design-patterns oop wxwidgets

伙计们,我正在编写一个应用程序的GUI,一个插入cd的cd容器,目前我不是很清楚,我想我需要一些帮助来澄清我对面向对象设计的理解。

所以,首先,我使用观察者模式来构建抽象的Model和View类,以及具体模型(cd容器)和具体视图(cd容器视图)。然后我开始使用wxwidget框架设计和图形外观或布局(CDContainerWidget,来自wxPanel)为cd容器和其他gui控件MainFrame(来自wxFrame)等。

所以现在我有三个类:CDContainerModel(cd容器),CDContainerView(观察者模式的类)和CDContainerWidget(gui控件)。 那么我对CDContainerViewCDContainerWidget

应该做些什么不太清楚

我认为CDContainerWidget和CDContainerView都需要CDContainerModel。我想到了四种方法,但不知道哪种方法是合适的:

1)。将CDContainerWidget作为成员变量关联到CDContainerView中,然后将CDContainerView作为成员变量放入主框架中。

class CDContainerView:
  def __init__:
     self.gui=CDContainerWidget

class MainFrame:
  def __init__:
     CDContainerView

2)。 CDContainerView子类CDContainerWidget:

class CDContainerView(CDContainerWidget):

class MainFrame:

   def __init__:

     CDContainerView

3)。 CDContainerWidget子类CDContainerView:

class CDContainerWidget(CDContainerView):

class MainFrame:
  def __init__:
     CDContainerWidget

4)。而不是使用CDContainerWidget和CDContainerView,只使用单个类CDContainerBig,它是抽象类View和wxPanel的子类

class CDContainerBig(View, wxPanel)

我的问题是什么是正确的解决方案?我已经阅读了MVC模式的wiki页面,但我并不真正理解它的描述,也不知道如何并且也不知道将它应用于我的问题是否合适。

好吧,我补充了一些评论。最初,当我开始设计编程时,我没有多想,只是选择,2)方法。但现在,我认为3)是好的。因为将widget放在widget中是合理的(CDContainerWidget放入MainFrame)。但我不太确定。此外,它似乎与观察者模式,三个类扭曲和awkard。有时,在我看来,这4个可能是相同的,只包括谁或谁向谁发送信息。好吧,我想我真的需要澄清这一点。

另外,我赞成3)因为实用点.CDContainerWidget实际上包含几个子窗口小部件组件(按钮,输入框等),如果我们改变类似通过子组件小部件设置新值的东西,那么1),我们需要CDContainerWidget来了解CDContainerView,让CDContainerView通知其他视图。 2)更糟糕的是,CDContainerWidget必须知道它的儿童CDContainerView。 3)CDContainerWidget本身就是CDContainerView,所以非常合理。 4)好,容易,但没有逻辑分离。这是我自己的想法,不知道它是否正确。

谢谢!

2 个答案:

答案 0 :(得分:1)

选项1似乎最合适。一般情况下,除非模式需要继承,否则应该避免继承,或者有其他令人信服的理由使用它。过度使用继承将使您的代码集成得比以前更紧密。

答案 1 :(得分:1)

有什么可以让你更容易摆脱类之间的耦合,实现信号槽模式,如Spiff Signal,或其他信号/插槽模块之一。

通过解耦通信逻辑,您可以完全放弃模块直接通话的需要,而是使用带回调的消息传递。