0

我已经几乎完全理解了 MVC 模式,但是有一点让我仍然感到困惑:

假设 - 出于本示例的目的 - 我有一个控制器、一个模型和 5 个视图。每当模型发生更改时,我想(最佳地)更改这 5 个视图的(适当的)子集作为模型更改的结果。

什么是正确的方法?

到目前为止,我对 MVC 的理解是,模型不应该对控制器或视图一无所知。这也适用于视图吗?即视图也不知道控制器模型吗?

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

伪代码:

选项1

模型

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

notifyObserver(){

    observer.modelChanged();    

}

控制器

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);

}

测试类

main(){

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

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

}

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

选项 2

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

测试类

 main(){

   create model;

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

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

}

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

4

1 回答 1

0

很难找到最适合您的解决方案以及您实际要求的解决方案。

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

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

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

于 2013-11-03T16:18:37.210 回答