2010-01-26 64 views
1

我希望这不是非常简单和明显的。
我有一些类似的程序,我在工作。在每个项目中,我必须实施未来的节能项目。我想出了如下设计:如何从gui中分离模型?

Project 
-- Program1Project 
-- Program2Project 

的基础类项目:

class Project 
{ 
public: 
    void NewProject(); 
    void SaveProejct(); 
    void OpenProject(); 
protected: 
    virtual void New(); 
    virtual void Save(); 
    virtual void Open(); 
}; 

虚函数在派生类中重新实现导致只有特定的程序知道如何(哪些对象保存到磁盘)来实际上保存了项目。

保存新的或打开一个项目显示另存为/打开对话框,从中用户将选择在哪里保存/打开项目的也有一部分。

void Project::NewProject() 
{ 
    1. // Show dialog for whether to save existing project 
    2. // check whether the project was already saved 
    3. // if yes, only overwrite the existing project 
    4. // if no, show SaveAs Dialog 
    5. // ... 
    6. this->New(); 
} 

行1至图5是代码,所有我的节目的需要,即,流动和为了在其中创建的对话框,并检查: 例如,NewProject()被新方法方面实现执行的是相同的。

我的想法是创建对话框中的实际代码是否应该被放置在项目::新和项目::打开方法。经过一番思考,我决定它不是很好的解决方案,因为Project类是模型类,而模型类不应该创建GUI。所以,我想可能是将代码从第1行写入第5行的最佳位置是在特定程序的保存/打开按钮事件处理程序中。但这意味着我将不得不为每个节目复制它。

所以,问题是我应该如何分开对话的创建,这将是我所有的计划同样在这样的实际保存/打开项目不需要的代码复制?

回答

4

的GUI应参考模型,而不是模型的图形用户界面,并且几乎保持自由的GUI模型的关系。真的没有办法让GUI完全免费。在某些情况下,即使实现隐藏在GUI之外,你也会有某种依赖性。

+0

+1:此外,我们通常在开始编写GUI之前对模型进行单元测试。这确保模型独立于GUI而存在。然后,我们在模型完成并进行单元测试后添加GUI。 – 2010-01-26 14:41:16

1

您可以创建一个独立的类,充当模型和视图之间的控制器。控制器可能是项目的成员,例如在线1上,您可以拨打电话this->viewController->showDialog(callBackForYes, callBackForNo, callBackForCancel)

viewController类可以直接回显gui,或将视图类用于不同的gui组件。

+0

但模型不应该知道控制器,即控制器可以调用模型上的方法,但模型不能调用控制器上的方法。或者,我错了? – user152508 2010-01-27 10:56:13