对MVC模式略有困惑

时间:2013-11-03 15:54:20

标签: model-view-controller

我几乎完全理解MVC模式,但有一件事让我感到困惑:

让我们说 - 为了这个例子的目的 - 我有一个控制器,一个模型和5个视图。每当模型发生变化时,我都希望(最佳地)根据模型的变化更改这5个视图的(适当的)子集。

这样做的正确方法是什么?

到目前为止,我对MVC的理解是模型不应该对控制器或视图有任何了解。这也适用于视图吗?即该视图是否也不了解控制器 AND 模型?

基于上述假设,我对具有给定要求的MVC程序的提议在结构上看起来像这样:

伪代码:

  

选项1

MODEL

//Random data, no references to either controller or view

notifyObserver(){

    observer.modelChanged();    

}

CONTROLLER

reference MODEL
reference VIEW

var model;

var view1;
var view2;
var view3;
var view4;
var view5;


createController(m,v1,...,v5){
    model = m;
    view1 = v1;
    .
    .
    .
    view5 = v5;

}

modelChanged(){
    view1.updateView(model.someVariable);
    view4.updateView(model.someVariable);
} 

查看

//no references to either model or controller

//some visual elements

updateView(var someVariable){

    myVisualElement.change(someVariable);

}

识别TestClass

main(){

   create view1;
   create view2;
   .
   . 
   . 
   create view5;

   create model;
   create controller(model,view1,...view5);
   model add observer(controller);

}

所以我基本上在做这件事,就是让控制器知道所有事情,而视图和模型都是完全独立的。在这种情况下,CONTROLLER是唯一一个在模型中发生变化时收到通知的人。然后它将继续并相应地改变其观点。

  

选项2

所以VIEW基本上会有一个名为model的属性/变量,我将使用这样的构造函数传递:

识别TestClass

 main(){

   create model;

   create view1(model);
   create view2(model);
   .
   . 
   . 
   create view5(model);

   create controller(model);
   model add observer(view1);
   . 
   . 
   .
   model add observer(view5);

}

这样,所有视图都引用了模型,并在模型发生变化时立即通知。 我很困惑,因为我不确定哪种方法是正确的......我希望你能一劳永逸地帮助我理解这一点。

1 个答案:

答案 0 :(得分:0)

很难理解什么是最适合您的解决方案以及您实际要求的内容。

您使用哪种技术,依赖于平台,MVC可能会有一些特定的细微差别? MVC基本上没有像observer.modelChanged那样的东西,如果你确实使用它,那就会增加一些关于inplementation细节的限制/可能性。

例如,如果您使用移动应用程序,您宁愿将MVC转换为MvvM(Model-View-ViewModel)(其中ViewModel将充当控制器),在这种情况下,“Controller”只会知道Model和View只知道Controller(部分代表它的模型)。

如果您使用Web应用程序((ASP.NET)MVC),您将拥有一个Controller,它将模型传递给Views(不知道View实际上是如何工作的)。视图也会知道模型并适应它,但也与Controller取得联系。与此同时,模特不会知道所提到的任何人。