【问题标题】:Slightly confused about MVC pattern对 MVC 模式有点困惑
【发布时间】:2013-11-14 07:26:30
【问题描述】:

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

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

正确的方法是什么?

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

基于上述假设,具有给定要求的 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);

}

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

【问题讨论】:

标签: model-view-controller


【解决方案1】:

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

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

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

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

【讨论】:

  • 好吧,我只是想知道在 Model 和 View 之间隐藏数据并让 Controller 成为中介是否普遍可以接受和普遍。在 iOS 中这样做是很常见的(至少他们在 iTunes U iPhone 和 Ipad 开发课程中声称是这样),所以这就是我问的原因......
  • 嗯,“控制器作为中介”是 MVC 概念的基本思想。我并没有真正关注在这种情况下让你感到不舒服的原因?
  • 我觉得视图不应该对模型一无所知,因此视图不应该对视图有任何引用,我也不希望它成为它的观察者。我有这种错误的感觉吗?
  • 我不确定您是否查看过这个答案:stackoverflow.com/a/101561/691660,但它确实非常广泛地说明了任何部分应该做什么和什么时候做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 2013-06-19
  • 2011-07-10
相关资源
最近更新 更多