我对MVC模式理解上有些困惑。我确实理解我们试图将GUI与业务逻辑解耦,但我不明白如何做到这一点。
据我所了解,View
是用户所看到的内容。因此,它通常是窗口/表单。 Controller
位于View
和Model
之间。控制器将使数据在两个方向上“流动”。当需要时,它还会保持状态(如果我有一个包含5个步骤的向导,则由Controller
负责确保按正确顺序完成等)。Model
是应用程序逻辑核心所在的地方。
这个理解正确吗?
为了尝试将其转化为更有意义的内容,我将尝试使用WinForms进行简单示例的草图(请勿使用ASP.NET或WPF!-对于Java群体而言,从我所了解的情况来看,Swing的工作方式与WinForms类似),以查看我的理解是否正确,并提出我经常遇到的问题。
假设我有一个包含一个类的模型(只是为了让它更容易。我知道这样会让示例看起来很愚蠢,但这样更容易),
class MyNumbers {
private IList<int> listOfNumbers = new List<int> { 1, 3, 5, 7, 9 };
public IList<int> GetNumbers() {
return new ReadOnlyCollection<int>(listOfNumbers);
}
}
现在是时候制作我的Controller
了:
class Controller
{
private MyNumbers myNumbers = new MyNumbers();
public IList<int> GetNumbers() {
return myNumbers.GetNumbers();
}
}
View
应该只有一个ListBox
,其中包含从MyNumbers
中检索到的所有数字。
首先,第一个问题:
Controller
是否应该负责创建MyNumbers
?在这种简单情况下,我认为这是可以接受的(因为MyNumbers
将完全相同,无论如何,并且没有关联状态)。 但是假设我想要为应用程序中所有不同的控制器使用相同的MyNumbers
实例。 我需要将我想要使用的那个MyNumbers
实例传递给此Controller
(以及所有其他需要它的人)。 谁将对此负责?在WinForms示例中,这是View
吗?还是创建View
的类?
反过来问:这3个部分的实例化顺序是什么?“MVC”的“所有者”调用了哪些代码来创建它?
Controller
应该创建View
和Model
吗?
或者View
应该实例化Controller
,而Controller
实例化Model
吗?
第二个问题:
如果我只想让我的应用程序具有此Controller
所代表的Use Case
,那么main
方法应该是什么样子的?
第三个问题:
为什么在下面的MVC图中,View
有一个指向Model
的箭头?
Controller
不应该始终是View
和Model
之间的桥梁吗?
我可能还有一两个问题,但在理解这个第一个细节后提出它们可能会更有意义。或者也可能是在理解第一个问题后,所有其他问题都会迎刃而解。
谢谢!