如何将模型与gui分开?

时间:2010-01-26 14:31:48

标签: user-interface model business-logic

我希望这不是一件非常微不足道的事情 我有一些类似的程序,我正在工作。在每个项目中,我都要实施有关保存项目的未来。我带来了以下设计:

Project
 -- Program1Project
 -- Program2Project

基类Project:

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

虚拟函数在派生类中重新实现,因为只有特定程序才知道如何(保存到磁盘的对象)实际保存项目。

保存新项目或打开项目的一部分是显示SaveAs / Open对话框,用户将从中选择保存/打开项目的位置。 例如,NewProject()是根据New方法实现的:

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行是我所有程序都需要的代码,即创建对话框和执行检查的流程和顺序是相同的。

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

所以问题是我应该如何分离创建对话框,这些对话框对于我的所有程序来说都是以不需要复制代码的方式实际保存/打开项目?

2 个答案:

答案 0 :(得分:4)

GUI应该引用模型,而不是GUI的模型,这几乎可以保持模型的关系不受GUI的影响。实际上没有办法让GUI完全脱离模型。在某些时候,即使实施隐藏在GUI之外,您也会有某种依赖性。

答案 1 :(得分:1)

您可以创建一个单独的类,充当模型和视图之间的控制器。控制器可以是项目的元素,例如,在第1行,您可以调用this->viewController->showDialog(callBackForYes, callBackForNo, callBackForCancel)

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