MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
MVC并不是Java语言所特有的设计思想,也不是Web应用所特有的思想,它是所有面向对象程序设计语言都应该遵循的规范。
视图层负责显示模型层的内容。它从模型层取得数据并指定这些数据如何被显示出来。在模型层变化的时候,它将自动更新。另外视图层也会将用户的输入传送给控制器。
控制层负责定义应用程序的行为。它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作;在一个图形界面中,常见的用户输入包括点击按钮和菜单选择。在Web应用中,它包括对Web层的HTTP GET和POST的请求;控制层可以基于用户的交互和模型层的操作结果来选择下一个可以显示的视图,一个应用程序通常会基于一组相关功能设定一个控制层的模块,甚至一些应用程序会根据不同的用户类型具有不同的控制层设定,这主要是由于不同用户的视图交互和选择也是不同的。
在模型层、视图层和控制层之间划分责任可以减少代码的重复度,并使应用程序维护起来更简单。同时由于数据和商务逻辑的分开,在新的数据源加入和数据显示变化的时候,数据处理也会变得更简单。
概括起来,MVC具有如下优势:
1 多个视图可以对应一个模型。按MVC设计模式,一个模型对应多个视图,可以减少代码的复制和代码的维护量,一旦模型发生改变,也易于维护。
2 模型返回的数据与显示逻辑分离。模型数据可以应用任何的显示技术,例如:使用JSP页面、Velocity模板或者直接产生Excel文档等。
3 应用被分隔为三层,降低了各层之间的耦合,提供了应用的可扩展性。
4 控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起,完成不同的请求。因此,控制层可以说是包含了用户请求权限的概念。
5 MVC更符合软件工程化管理的思想。不同的层各司其职,每一层的组件具有相同的特征,有利于通过工程化和工具化产生管理程序代码。
但是,任何事物都有两面性,MVC也不例外,那么它有什么不好的地方呢?
1 增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图和控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
2 视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是非常有限的,反之亦然,这样就妨碍了他们的独立重用。
3 视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
小结一下:
从设计模式的角度来看,MVC思想非常类似于观察者模式,但是与观察者模式存在少许差别:观察者模式下观察者和被观察者可以是两个互相对等的对象,但对于MVC思想而言,被观察者往往只是单纯的数据体,而观察者则是单纯的视图页面。
经典的MVC思想与Web应用的MVC思想也存在一定的差别,主要原因是因为Web应用是一种请求/响应模式下应用,对于请求/响应应用,如果用户不对应用发出请求,视图自身是无法主动更新自己的。