修改
我所做的是将“主窗口”创建和消息处理程序移动到控制器中,现在只有控制器需要知道模型和视图。由于主窗口消息是在控制器本身中处理的,因此可以轻松调用视图进行更改,并调用模型来执行逻辑,视图永远不需要调用模型,如果模型需要与View通信,则有3个选项:< / p>
可以通过向Model中的调用返回一个值,然后根据Model返回的内容调用View来实现。
模型可以将WM_APP消息发布到主窗口,然后模型调用相应的视图。
如果更改非常小,例如,更改静态控件的文本,Controller可以将句柄传递给那些控件,Model和Model可以自行进行更改。
有任何建议吗?
我试图理解MVC如何在c ++和纯winapi中工作,所以我正在开发一个演示应用程序,并试图实现我自己的MVC解释/版本。 我们的想法是让控制器保持完全控制,一切都通过控制器进行中继。
设计:
每个类都将在它自己的文件.h和.cpp中 我们的main.cpp,视图类和模型类都只能与控制器和控制器进行通信,之后就不会有任何通信。
它看起来像:
问题: 不同文件中的共同依赖类太多了。
如果可能的话,你会建议采用什么样的方法,我想保持“通过控制器传递所有内容”的想法。
答案 0 :(得分:4)
缺少的是某种抽象接口,用于视图和模型进行通信。即,您依靠具体类型进行沟通。
这可以通过几种不同的方式解决:
IModelListener
,IViewListener
),控制器实现。 ValueEnteredEvent
和来自模型的ValueChangedEvent
。控制器分别使用您喜欢的任何方法连接到视图和模型对象。因此,它们不直接了解控制器,它们只与这些给定的接口通信。
答案 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中的方法声明。