MVC和c ++中的共同依赖类

时间:2013-06-11 05:08:21

标签: c++ winapi model-view-controller

修改

我所做的是将“主窗口”创建和消息处理程序移动到控制器中,现在只有控制器需要知道模型和视图。由于主窗口消息是在控制器本身中处理的,因此可以轻松调用视图进行更改,并调用模型来执行逻辑,视图永远不需要调用模型,如果模型需要与View通信,则有3个选项:< / p>

  1. 可以通过向Model中的调用返回一个值,然后根据Model返回的内容调用View来实现。

  2. 模型可以将WM_APP消息发布到主窗口,然后模型调用相应的视图。

  3. 如果更改非常小,例如,更改静态控件的文本,Controller可以将句柄传递给那些控件,Model和Model可以自行进行更改。

  4. 有任何建议吗?


    我试图理解MVC如何在c ++和纯winapi中工作,所以我正在开发一个演示应用程序,并试图实现我自己的MVC解释/版本。 我们的想法是让控制器保持完全控制,一切都通过控制器进行中继。

    设计:

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

    1. 视图类(将有超过1个gui(子窗口),包括主窗口gui)将只创建,显示,隐藏和销毁窗口(视图)的消息循环主窗口和任何子或超级子窗口将驻留在控制器文件夹或模型文件夹中。
    2. 控制器还将包含文件views.h的子文件夹,用于与视图类和model.h进行通信的views.cpp,用于与模型类进行通信的model.cpp,结构与视图类似
    3. 模型将在不同文件中包含与应用程序相关的不同逻辑的文件。
    4. 它看起来像:

      enter image description here

      问题: 不同文件中的共同依赖类太多了。

      如果可能的话,你会建议采用什么样的方法,我想保持“通过控制器传递所有内容”的想法。

3 个答案:

答案 0 :(得分:4)

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

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

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

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

  • 避免具体依赖&amp;连接。
  • 通过接口(由它自己定义的对象)将它们抽象出来
  • 确保每个对象尽可能少地知道(但不能少),以便与其同行进行有效沟通。

答案 1 :(得分:0)

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

控制器将具有到模型类和视图类的开放管道。 视图将打开子视图类的管道。

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

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

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

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

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

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

所有沟通都是通过读写相应的管道来完成的。

答案 2 :(得分: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中的方法声明。