我几乎完全理解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);
}
这样,所有视图都引用了模型,并在模型发生变化时立即通知。 我很困惑,因为我不确定哪种方法是正确的......我希望你能一劳永逸地帮助我理解这一点。
答案 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取得联系。与此同时,模特不会知道所提到的任何人。