MVC模式
MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,它是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
模型-视图-控制器(MVC)是一个相当实用且十分流行的设计模式。MVC设计模式在视图和模型间插入控制器类,移除视图和模型间的依赖。模型以及视图,可重复使用而无需修改。这样,实现新的功能和维护变得轻而易举。在一个典型应用中,总会发现这三个基本组成部分:数据(模型);查看和修改数据的接口(视图);可以对数据施加的操作(控制器)。MVC模式,简言之,就是:模型代表数据,除此之外别无它用,模型不依赖于控制器或视图。视图显示模型数据,发送用户动作(例如按钮点击)到控制器。 视图可以独立于模型和控制器的;或者作为控制器,因此依赖于模型。控制器提供模型数据至视图,解释用户的行为,如按钮的点击,控制器依赖于视图和模型。在一些情况下,控制器和视图可以合二为一。
MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器,它们各自处理自己的任务,这就出现了分层概念 。
1.视图
视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由HTML元素组成的界面,在新式的Web应用程序中,HTML依旧在视图中 扮演着重要的角色,但一些新的技术已层出不穷,它们包括Adobe
Flash和象XHTML,XML/XSL,WML等一些标识语言和Web services。
MVC一个大的好处是它能为你的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。
2.模型
模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用象EJBs和ColdFusion Components这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于
模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
3.控制器
控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。
以一个地址簿应用的程序为例,模型是一些Person对象,视图是一个GUI窗口,显示联系人列表,并且控制器处理用户行为诸如“删除联系人”,“添加联系人”,“发邮件至联系人”等。
下面列举两个例子,通过对比来了解MVC模式
//例子 1(没有使用MVC):
void Person::setPicture(Picture pict){
m_picture = pict; //set the member variable
m_listView->reloadData(); //update the view
}
//例子 2(使用了MVC):
void Person::setPicture(Picture pict){
m_picture = pict; //set the member variable
}
void PersonListController::changePictureAtIndex(Picture newPict, int personIndex){
m_personList[personIndex].setPicture(newPict); //modify the model
m_listView->reloadData(); //update the view
}
在上面的例子中,Person类并不知道视图的存在。PersonListController负责模型修改和视图更新。视图窗口告诉控制器用户的行为(就上述情况而言,它将提醒控制器用户修改了一个联系人的照片)。
继续以地址簿应用为例。新增需求为需要另一个窗口显示所有联系人的照片,这些照片应该是处于一个表格布局中,每排五张照片。如果应用程序采用了MVC,这个任务相当简单。 目前主要有三个类: Person , PersonListController和PersonListView。 还需要创建两个类: PersonPhotoGridView和PersonPhotoGridController 。 在Person类保持不变的情况下,很容易插入两种不同的视图。 如果应用程序具有例1中类似的结构,任务立马变得棘手了。此时有两个类Person 和PersonListView 。Person类不能插入另一种视图,因为它包含了涉及PersonListView类的具体代码 。 开发人员必须修改Person类以适应新的PersonPhotoGridView ,并最终像这样复杂化模型:
//Example 3:
void Person::setPicture(Picture pict){
m_picture = pict; //set the member variable
if(m_listView){ //check if it's in a list view
m_listView->reloadData(); //update the list view
}
if(m_gridView){ //check if it's in a grid view
m_gridView->reloadData(); //update the grid view
}
}
由此可见,MVC设计模式的最大的优点就是MVC使得模型类不加修改即可重复使用,而控制器存在的目的是消除模型与视图依赖关系。,从模型中移除视图依赖后,模型代码变得整洁起来。