最近一直都在看有关三层和MVC的资料,说来也挺可笑的,刚开始看培养目标的时候,还以为三层和MVC是同一个东西呢,所以去图书馆找资料的时候,也是想着要么找本MVC要么找本三层的书就可以了。反正两者都是一样的嘛!
随着查阅资料的增多,才发现三层和MVC还真不是同一个东西。那么三层和MVC是什么呢?它们两者有什么区别呢?由于没有项目经验,还只是在初步学习阶段,所以只能借鉴网上大部分主流的观点,先从理论上了解它们,以后会从实践中去体会和了解。
1.什么是三层? 看下面的图:
所谓的三层体系结构,就是在客户端和数据之间加入了一个“中间层”,也叫“组件层”。这里的三层体系不同于物理上的三层,而是逻辑上的三层,是一种体系结构。典型的三层体系结构是由表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)构成。
联系现实生活,就会发现用三层体系结构开发的系统与饭店类似,例如下面的这张图:
上图中可以看出,表示层对应的是饭店的服务员,直接和客户打交道。业务逻辑层对应的是饭店的厨师,负责把采购回来的食品进行加工完成,传递给服务员;数据访问层只负责数据的存储工作,类似于饭店的采购,系统里有什么数据取决于数据访问层的工作,饭店提供什么样的材料取决于采购回来什么材料。
区分层次的目的即是为了“高内聚,低耦合”的思想。就像饭店中的服务员、厨师和采购员,他们都是独立的个体,一个个体的变化和更改并不影响到另一个个体。例如,如果服务员某天离职了或是请假了,直接用其他的服务员代替即可,而厨师和采购员并不需要发生改动。
层是一种弱耦合的关系,层与层之间的依赖是向下的,底层对于上层而言是“无知”的,改变上层的设计对于其调用的底层而言没有任何的影响。
其实这里的三层并不是说只有三层,可能是有更多的层。其实相对于不分层的编程方法来说,使用三层或多层架构的应用程序反而运行效率低,代码量大,难度增加。所以三层一般是适用于大型的项目系统,使用多人多组开发。这样适用三层就有利于团队的分工合作,开发人员可以只关注整个结构中的某一层。就像上面的服务员,厨师和采购员,分工合作,各司其职。表示层:主要是指与用户交互的界面,用于显示数据和接收用户输入的数据
业务逻辑层:处在表示层与数据访问层中间,起到了数据交换中承上启下的作用;做一些有效性的验证工作,如完成数据添加,修改和查询业务等。
数据访问层:主要是负责数据库的访问。简单的说就是通过DAL对数据库进行SQL操作。
2.什么是MVC?看下面的图:
MVC全名是Model View Controller,是模型(model)-视图(View)- 控制器(Controller)的缩写。MVC开始是存在Desktop程序中,M是指数据模型,V是指用户界面,C则是控制器,MVC模式的目的就是实现Web系统的职能分工。Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。View层用于与用户的交互,通常用JSP来实现。Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示。
3.三层与MVC的区别
如果要把三层和MVC进行比较的话,那么三层架构和MVC的相同之处在于他们都有一个表现层。它们的设计理念都是一样的,即把视图设计和数据持久化 进行分离,从而降低耦合性,易于扩展,提高团队开发效率。不同的是,在三层架构中没有定义一个Controller的概念,而MVC也没有把业务的访问看成两个层,这是采用三层架构或MVC搭建程序最主要的区别。当然,三层中也提到了Model,但是三层架构中的model是以实体类构成的,而MVC,则是由业务逻辑与数据访问组成的。
为了比较它们两者的不同,我们可以引入这么一个例子:
例如,路人甲在在安次区逛街,有人要他,打110报警了。路人乙,在广阳区也被人了他也打110报警。他们再打110的时候,接电话的是某某城市的公安局指挥中心。对于路人甲,指挥中心派出的是安次区的分警去解救。对于路人乙,指挥中心派出的是广阳区的分警去解救。对于路人甲和路人乙,他们不需要知道的是到底谁来解救他们,他们只要拨打110即可(类似于页面数据由action提交到控制器),由110的指挥中心确定他们的位置和派出地方警局去解救(控制器根据需求调用Model层去完成对应的数据处理),而三层架构中如果这两个人被了,他们直接到当地警察局(调用BLL层的方法)找警察来处理。
其实,不管是三层还是MVC,他们所分的层都相当于是一个黑盒子,我们不用知道它们内部是怎么实现的,只需要去调用它们就行了。每层只需要与上下相邻的两层打交道。当一层的局部由于技术发生改变时,只要接口不变,其他层就不需要进行任何改变。