首先,我使用观察者模式构建了抽象的Model和View类,以及具体的模型(CD容器)和具体的视图(CD容器视图)。然后我开始使用wxwidget框架为CD容器和其他GUI控件(如MainFrame)设计图形外观或布局(CDContainerWidget,从wxPanel继承而来)。
现在我有三个类:
CDContainerModel
(CD容器),CDContainerView
(观察者模式的类),以及CDContainerWidget
(GUI控件)。然后我对CDContainerView
和CDContainerWidget
应该怎么处理感到不太清楚?我认为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模式的维基页面,但是我并不真正理解它的描述,也不知道如何应用它解决我的问题。
嗯,我有一些额外的评论。最初,当我开始设计程序时,我没有考虑太多,只选择了2)方法。但现在,我认为3)方法更好。因为将小部件放入小部件中(将CDContainerWidget放入MainFrame)是合理的。但我不是很确定。此外,使用观察者模式似乎使三个类变得扭曲和笨拙。有时候,我觉得这四个类可能是相同的,只是谁包含谁,或者谁向谁发送消息。嗯,我想我真的需要澄清这一点。
另外,我支持3)是由于一个实际的原因。CDContainerWidget实际上包含几个子小部件组件(按钮,输入框等),如果我们像通过子组件小部件设置新值这样的更改,则对于1),我们需要CDContainerWidget知道CDContainerView,以便让CDContainerView通知其他视图。对于2)来说更糟糕的是,CDContainerWidget必须了解其子CDContainerView。对于3) CDContainerWidget本身就是CDContainerView,因此相当合理。对于4) 嗯,很容易但没有逻辑分离。这是我自己的想法,不知道是否正确。
谢谢!