对MVC模式的理解
自从接触Java以来,无论是JavaWEB应用中Struts框架,还是Java swing桌面应用,都无数次听到MVC这个概念,那么到底什么是MVC,在这里我谈一下个人的理解。
首先,MVC是面向对象软件设计的一种模式,设计的使用目的是为了减少软件日益增长的复杂度,使得软件的可维护性,可复用性得到提高。 进一步说,MVC设计模式的应用偏重于GUI相关,即所谓图形用户界面,比如说office,QQ这种桌面应用程序,或者是基于浏览器的网络应用,这些应用都需要大量的窗口、菜单、文本域来与用户进行交互。而像服务器这种应用,基本不需要GUI。
GUI的产生是为了让非专业人员使用计算机,而不用死记硬背大量命令,它的特点是可以减少用户的认知负担,同时可以满足不同用户的创意需求,其中最重要就是简单、形象和美观。为了满足GUI的需要,我们有时不能够将数据直接展现出来,而需要在其外面包装上一层GUI,比如,一组统计数据,可以用表来展示,也可以用柱状图来表示,也可以用饼状图来表示,这样一来,原本只需要输出几个数据,现在却要做3份工作,加大了软件的复杂度。而MVC模式正是为了简化GUI开发的复杂性而出现的。
计算机中,一切都可以最终归结为数据,在GUI应用中,数据可以分为GUI数据和应用数据,前者代表GUI的状态,例如一个按钮按下时为0松开时为1,后者表示与GUI无关的数据,例如一张报表,它可以是一张GUI中的表,也可以使GUI中的柱状图。在MVC模式实现GUI的过程中, MVC模式分离了Model和View这两者,分离了以上所说的数据和显示,并抽象地设置了Controller这个对象。当Model或者View更新时,它们需要向Controller发送一个状态改变的事件信息,由Controller负责更新其对应的状态。
HTTP是一种无状态协议,其本质上由一个请求和一个响应组成:浏览器请求一个特定 URL(可能还提供补充数据),服务器用一个响应页面来应答。尽管最终用户可能觉得他们的网上冲浪过程由一系列连续的步骤组成,但是对于协议来说,每个交付的页面都是相互独立的;任何显示仅仅是与最近的 URL 请求对应的输出。交互发生在客户端到服务器的提交上,对于用户来说,浏览器可以表示View方,当用户点击提交按钮时,要求服务器作出相应的反应,来更新自身的View状态。在Struts中,用户的每次提交都会触发一个action,可以将这个action看做一个事件,每一个action都会被ActionServlet类这个Controller拦截,然后访问Model来更新View信息。这样做的好处在于,当我们需要对数据以不同的View呈现时,只需要新加入一个View页面,并将其指向对应的action即可,这样我们事实上只加入了新的内容,而没有对以前的代码进行修改,符合“开闭原则”,而且只需要修改View而实现了对Controller和Model的重用。