0

编辑:

我所做的是将“主窗口”创建和消息处理程序移动到控制器中,现在只有控制器需要了解模型和视图。由于主窗口消息是在控制器自己处理的,所以可以很方便的调用view来改变,调用model来做逻辑,view永远不需要调用model,如果model需要和View对话,那么有3个选项:

  1. 它可以通过从 Model 向调用返回一个值,然后 Model 根据从 Model 返回的内容调用 View 来做到这一点。

  2. Model 可以将 WM_APP 消息发布到主窗口,然后 Model 相应地调用 View。

  3. 如果更改非常小,例如更改静态控件的文本,控制器可以将这些控件的句柄传递给模型,模型可以自己进行更改。

有什么建议吗?


我试图了解 MVC 如何在 c++ 和纯 winapi 中工作,因此正在开发一个演示应用程序,并尝试实现我自己的 MVC 解释/版本。这个想法是让控制器处于完全控制状态,一切都通过控制器进行中继。

设计 :

每个类都在它自己的文件.h 和.cpp 我们的main.cpp,视图类和模型类都只能与控制器和控制器通信,它们之间不会直接进行任何通信。

  1. 视图类(将有超过 1 个 gui(子窗口),包括主窗口 gui)只会创建、显示、隐藏和销毁窗口(视图)主窗口的消息循环和任何子或超类子窗口将位于控制器文件夹或模型文件夹中。
  2. 控制器将进一步具有文件views.h,views.cpp用于与视图类通信和model.h,model.cpp用于与模型类通信的子文件夹,其结构与视图相似。
  3. 模型将在不同的文件中有与应用程序相关的不同逻辑的文件。

它看起来像:

在此处输入图像描述

问题:不同文件中有太多相互依赖的类。

你会建议什么样的方法,如果可能的话,我想保留“一切都通过控制器中继”的想法。

4

3 回答 3

4

缺少的是用于视图和模型进行通信的某种抽象接口。即,您依赖具体类型进行通信。

这可以通过几种不同的方式解决:

  • 控制器实现的作为侦听器/观察器的抽象基类(即IModelListener, )。IViewListener
  • 事件(即ValueEnteredEvent来自视图和ValueChangedEvent来自模型)。
  • 插槽和信号 ala Qt(或 Boost),它允许侦听器连接到对象的单个输出方法。

控制器使用您喜欢的任何方法分别连接到视图和模型对象。因此,它们不直接了解控制器,它们只与这些给定的接口对话。

  • 避免具体的依赖关系和连接。
  • 通过接口将它们抽象出来(由它自己的对象定义)
  • 确保每个对象知道的尽可能少(但不少于),以便与它的对等方进行有效通信。
于 2013-06-11T07:11:50.297 回答
0

我相信你可以使用管道做到这一点

控制器将有通往模型类和视图类的开放管道。视图将有通往子视图类的开放管道。

当子视图对数据进行更改时,它会通过管道将更改发送到主视图。

视图依次通过管道将更改发送到控制器。

控制器通过写入管道来更新模型。

模型更新数据并将刷新的数据发送给控制器。

控制器将刷新的数据发送到主视图。

然后视图将刷新的数据发送到子视图。

所有通信都是通过读取和写入各自的管道来完成的。

于 2013-06-11T05:48:26.533 回答
0

我在 MVC 模式上所做的是创建一个 ViewDelegate ,它是一个抽象类。让我的控制器继承自 ViewDelegate,并将控制器设置为 View 的委托。

    Class ViewDelegate{
Public:
     Virtual void onViewCallBack = 0;
}

    Class controller : public ViewDelegate{
Public:
       Static Controller* create();
Private:
       Bool init();
       Void onViewCallBack();
}

    Class view {
Public:
static view* create();
Bool initWithDelegate(ViewDelegate*)
Private:
Bool init();

}

使用 View 中的委托调用 Controller 中的方法声明。

于 2015-11-14T02:37:38.990 回答