我已经几乎完全理解了 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);
}
这样,所有视图都引用了模型,并在发生变化时立即由模型通知。我很困惑,因为我不确定哪种方法是正确的......我希望你能帮助我一劳永逸地理解这一点。