题记:对于刚接触项目的菜鸟来说,MVC是一个新鲜的东西,浅显的知道MVC是分为MODEL、View和controler层,于是觉得它与我们曾经用到的三层架构相似,于是就错误的混到了一起。由于想要知道它内部的逻辑运行,所以上网查了很多资料,才发现自己对MVC和三层的理解是错误的,所以在此总结一下自己对MVC的认识。
MVC出现的原因:
代码混乱:大部分Web应用程序都是用像ASP,PHP,或者CFML这样的过程化语言来创建的。它们将像数据库查询语句这样的数据层代码和像HTML这样的表示层代码混在一起。
分工不明确:通俗的举个例子来说:假设我们正在做一个简单的表单提交,我们希望对用户数据的数据进行验证和封装,最终交给业务逻辑层一个实体对象。从三层架构分析,验证和封装并没有明确的表明是处于哪层的职责范围,那么应该交给谁来做呢?
UI和BLL层依赖强:在三层框架中,我们经常把UI的逻辑控制(服务器控件的读取、设置、事件等等)写在页面的后置隐藏代码中,并且依赖于业务逻辑层。
结:我们在web开发中引入MVC思想,想要达到的目的是: 实现UI层和业务逻辑层分离——MVC充当了两层之间适配器的作用。
MVC组成:
View(视图):提供用户交互界面, 直接面向用户,可以直接理解为界面,它是提供给用户操作用户端,是程序的外壳,负责处理图形化操作界面,仅限于视图上的数据采集和处理,用户请求。项目越大,视图的复杂程度越多,如HTML、XHTML、XML/XSL、Web Service、Macromedia Flash等等。而MVC的机制正好可以处理很多不同的视图。
Model(模型):是核心的“数据层”,表示为业务数据和业务逻辑,是程序需要操作的数据和信息,负责封装和事务逻辑相关资料,以及处理资料方法,属于业务流程处理。应用于模型的代码只需写一次就可以被多个视图重用,减少了代码的重复性。
Controller(控制):负责根据用户从视图层输入的指令,选取数据层中的数据,控制应用程式流程,然后对其进行相应的操作,产生最终的结果,回应资料模型变化,简单来说就是负责选择什么样的模型,选择什么样的视图,来完成什么样的用户请求。
结:这三层是紧密联系又互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。这样一来,软件就可以实现模块化,修改外观或者变更数据都不用修改其他层,大大方便了维护和升级。
MVC运行过程:
用户的操作/命令-->控制器(C,内部进行识别和一定的信息收集等处理)-->模型(M,调用业务处理方法,进行状态的修改、数据的更新等处理)-->视图(V,根据模型对象内部状态、数据的更改而进行视图显示的更改)。
MVC与三层的区别:
名称域不同:三层架构,属于业务架构范围。而MVC模式,属于设计模式范围。
包含关系不同:MVC中的三层是三层架构中UI层的一部分,三层与MVC可以共存
Model意义不同:三层中MVC中Model层中业务逻辑与访问数据组成的,“三层”中典型的Model层是以实体类构成的
MVC与设计模式的区别:
MVC是一种比较特殊的模式,MVC并不属于23个设计模式之列,我们之前了解到的23个模式可以认为是一些中级的模式,在他们基础上也可以通过组合来得到一些高级的模式,即架构模式。
MVC可以看作是一些模式进行组合之后的结果,实际上,MVC的出现要早于设计模式的提出,因而只是对它在设计模式的基础上进行在分析。所以说现在有必要站在设计模式的思想上来看MVC模式。
MVC模式可以分解为以下设计模式组合模式+策略模式+观察者模式约等于MVC模式(当然MVC模式要多一些东西)。MVC还使用了其它的设计模式,比如说工厂方法模式用来说明对一个view的默认的控制器,还有装饰模式用来为view增加一个滚动条等。但是在MVC模式里起主要作用的还是前面列出来的三个设计模式。
策略模式:用户的操作/命令都会对应着一个个控制器,这里控制器就是一个个为操作/命令而定制的策略,通过它的封装来完成一系列或简单或复杂的操作。
观察者模式:模型对象分装了内部的业务处理,只是提供了各种操作业务和获取数据的方法,在改变状态和更新数据的时候会将状态的改变和数据的更新通知给关心这些状态和数据的使用者,于是,模型对象便是一个可观察者对象,它的观察者就是视图,因为视图需要根据模型对象的状态和数据来进行数据的特定显示。
组合模式:视图对象只是提供给用户的显示部分,而显示的部分因复杂程度不同而要使用到不同的显示组建,于是就要使用到组合模式了。
总结:在项目中通常使用三层架构与MVC的结合,系统比较庞大的话,通常设计的时候采用客户端与服务端的分离,架空MVC中的Model层,由controler直接与Bll层交互(有时候为了解表现层UI即(MVC)和业务层BLL之间的耦合,还会在业务层与表现层之间的服务端加入服务层,controler与service交互)
备注:以上是作者本人学习和借鉴的成果,肯定会有错误或不足之处,希望大家可以多多指正。