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

pep*_*ero 5 python oop user-interface wxwidgets design-patterns

伙计们,我正在编写一个应用程序的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
Run Code Online (Sandbox Code Playgroud)

2).CDContainerView子类CDContainerWidget:

class CDContainerView(CDContainerWidget):

class MainFrame:

   def __init__:

     CDContainerView
Run Code Online (Sandbox Code Playgroud)

3).CDContainerWidget子类CDContainerView:

class CDContainerWidget(CDContainerView):

class MainFrame:
  def __init__:
     CDContainerWidget
Run Code Online (Sandbox Code Playgroud)

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

class CDContainerBig(View, wxPanel)
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢!!

syn*_*tel 1

使用Spiff Signal或其他可用的信号/槽模块之一来实现信号槽模式可能会让您更容易摆脱类之间的耦合。

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