三层架构与MVC的区别
我们平时总是将混为⼀谈,殊不知它俩并不是⼀个概念。下⾯我来为⼤家揭晓我所知道的⼀些真相。
⾸先,它俩根本不是⼀个概念。
三层架构是⼀个分层式的软件体系架构设计,它可适⽤于任何⼀个项⽬。
MVC是⼀个设计模式,它是根据项⽬的具体需求来决定是否适⽤于该项⽬。
那么架构跟设计模式有什么区别呢?
我们从接⼿⼀个项⽬开始,⾸先,我们需要进⾏架构设计,⼀般我们采⽤的就是分层式的架构设计,即我们的三层架构。
然后,在确定了架构以后,我们再根据项⽬的具体需求去考虑是否需要应⽤⼀些设计模式,⽐如是否应⽤我们的MVC模式,抽象⼯⼚模式等等。(在这⾥我们看出,MVC与三层架构不是⼀个等级的,⽽与抽象⼯⼚等设计模式才是⼀路的)
最后,确定了模式以后,就是我们的⼀些具体的实现了。(当然⼀个项⽬不仅仅考虑这些问题,我只是为了说明两者的区别,将其他问题已省略)
其次,它俩划分的层次不同。
三层架构将整个项⽬划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。
MVC 即Model(模型),View(视图),Controller(控制)。
下⾯看⼀下他俩的区别与联系:
mvc三层架构如何实现 通过这个图我们可以知道,我们平常所说的V是UI,C是BLL,M是DAL的观点是错误的。
⽽我们通常所见到的MVC⼀般也都是在应⽤三层架构的基础上,即将Model层再进⾏分层。⽽如果Model不再进⾏划分的话,那么使⽤MVC的意义也就不⼤了。
然后,它俩的⽬的着重点不同。
三层架构的⽬的着重点是“⾼内聚,低耦合”,即解耦。
MVC的⽬的则是实现Web系统的职能分⼯,即职责划分。
其实职责划分也是解耦,但是三层侧重的是整体的⼀个解耦,⽽MVC侧重的是web系统的解耦,即侧重jsp和Servlet的⼀个解耦。
最后,为何我们会将其混为⼀谈?
既然两者有这么多的不同,我们为什么还总是将其混淆呢,下⾯我列举了⼏个我们常常将其混为⼀谈的⼏个原因:
1.⼆者都是“三层”。
这个原因是最容易迷惑我们初学者的,⼀个是UI,BLL,DAL,⼀个是View,Controller,Model,不都是三层吗?
虽然都是“三层”(不⼀定是真的三层,还可以是多层),但是它们的划分的不⼀样。⼤家可从上⾯的图中看出不同。
2.MVC总是伴随着三层架构。
这个就是我在前⾯⼀再强调的,我们⼀般是在考虑使⽤(也可以不使⽤)了三层架构的基础上再根据具体需求决定是否需要使⽤MVC,于是我们常说的MVC中总是伴随着三层架构,所以⼤家总是会认为MVC就是三层架构,三层架构就是MVC,殊不知,它们⼆者是⼀起出现的。
3.都是在分层,即都是在解耦。
前⾯说它们⽬的的时候也说了,虽然它们的侧重点不同,但是它们的总体⽬的是⼀样的,都是为了解耦,对于初学者⽽⾔,是不知道这两个侧重点有何不同的。
⼤家往往对它们的联系知道很多,不然也不会混为⼀谈,但是对它们的区别却知道较少,希望我上⾯讲解的它们两者之间的区别可以让⼤家对它们有些了解,如有写的不妥的地⽅,请指教。
三层架构(3-tier application)通常意义上的三层架构就是将整个业务应⽤划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的⽬的即为了“⾼内聚,低耦合”的思想。
1、表现层(UI):通俗讲就是展现给⽤户的界⾯,即⽤户在使⽤⼀个系统的时候他的所见所得。
2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
3、数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查等。
MVC是 Model-View-Controller,严格说这三个加起来以后才是三层架构中的UI层,也就是说,MVC把三层架构中的UI层再度进⾏了分化,分成了控制器、视图、实体三个部分,控制器完成页⾯逻辑,通过实体来与界⾯层完成通话;⽽C层直接与三层中的BLL进⾏对话。
mvc可以是三层中的⼀个表现层框架,属于表现层。三层和mvc可以共存。
三层是基于业务逻辑来分的,⽽mvc是基于页⾯来分的。
MVC主要⽤于表现层,3层主要⽤于体系架构,3层⼀般是表现层、中间层、数据层,其中表现层⼜可以分成M、V、C,(Model View Controller)模型-视图-控制器
曾把MVC模式和Web开发中的三层结构的概念混为⼀谈,直到今天才发现⼀直是我的理解错误。MVC模式是GUI界⾯开发的指导模式,基于表现层分离的思想把程序分为三⼤部分:Model-View-Controller,呈三⾓形结构。Model是指数据以及应⽤程序逻辑,View是指Model的视图,也就是⽤户界⾯。这两者都很好理解,关键点在于Controller的⾓⾊以及三者之间的关系。在MVC模式中,Controller和View 同属于表现层,通常成对出现。Controller被设计为处理⽤户交互的逻辑。⼀个通常的误解是认为Controller负责处理View和Model的交互,⽽实际上View和Model之间是可以直接通信的。由于⽤户的交互通常会涉及到Model的改变和View的更新,所以这些可以认为是Controller 的副作⽤。
MVC是表现层的架构,MVC的Model实际上是ViewModel,即供View进⾏展⽰的数据。 ViewModel不包含业务逻辑,也不包含数据读取。
⽽在N层架构中,⼀般还会有⼀个Model层,⽤来与数据库的表相对应,也就是所谓ORM中的O.这个
Model可能是POCO,也可能是包含⼀些验证逻辑的实体类,⼀般也不包含数据读取。进⾏数据读取的是数据访问层。⽽作为UI层的MVC⼀般不直接操作数据访问层,中间会有⼀个业务逻辑层封装业务逻辑、调⽤数据访问层。UI层(Controller)通过业务逻辑层来得到数据(Model),并进⾏封装(ViewModel),然后选择相应的View.
MVC本来是存在于Desktop程序中的,M是指数据模型,V是指⽤户界⾯,C则是控制器。使⽤MVC的⽬的是将M和V的实现代码分离,从⽽使同⼀个程序可以使⽤不同的表现形式。⽐如⼀批统计数据你可以分别⽤柱状图、饼图来表⽰。C存在的⽬的则是确保M和V的同步,⼀旦M改变,V应该同步更新。
MVC如何⼯作MVC是⼀个设计模式,它强制性的使应⽤程序的输⼊、处理和输出分开。使⽤MVC应⽤程序被分成三个核⼼部件:模型、视图、控制器。它们各⾃处理⾃⼰的任务。
视图V视图是⽤户看到并与之交互的界⾯。对⽼式的Web应⽤程序来说,视图就是由HTML元素组成的界⾯,在新式的Web应⽤程序中,HTML依旧在视图中扮演着重要的⾓⾊,但⼀些新的技术已层出不穷,它们包括Macromedia Flash和象XHTML,XML/XSL,WML等⼀些标识语⾔和Web services.如何处理应⽤程序的界⾯变得越来越有挑战性。MVC⼀个⼤的好处是它能为你的应⽤程序处理很多不同的视图。在视图中其实没有真正的处理发⽣,不管这些数据是联机存储的还是⼀个雇员列表,作为视图来讲,它只是作为⼀种输出数据并允许⽤户操纵的⽅式。
模型M模型表⽰企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。被模型返回的数据是中⽴的,就是说模型与数据格式⽆关,这样⼀个模型能为多个视图提供数据。由于应⽤于模型的代码只需写⼀次就可以被多个视图重⽤,所以减少了代码的重复性。
控制器C控制器接受⽤户的输⼊并调⽤模型和视图去完成⽤户的需求。所以当单击Web页⾯中的超链接和发送HTML表单时,控制器本⾝不输出任何东西和做任何处理。它只是接收请求并决定调⽤哪个模型构件去处理请求,然后再确定⽤哪个视图来显⽰返回的数据。
模型Model 模型是应⽤程序的主体部分。模型表⽰业务数据,或者业务逻辑。实现具体的业务逻辑、状态管理的功能。
视图View 视图是应⽤程序中⽤户界⾯相关的部分,是⽤户看到并与之交互的界⾯。就是与⽤户实现交互的页⾯,通常实现数据的输⼊和输出功能。
控制器controller 控制器⼯作就是根据⽤户的输⼊,控制⽤户界⾯数据显⽰和更新model对象状态。起到控制整个业务流程的作⽤,实现View层跟Model层的协同⼯作。
3层架构指:表现层(显⽰层)业务逻辑层数据访问层(持久化)如果⼤家⾮要“⽣搬硬套”把它和MVC扯上关系话那我就只能在这⾥”强扭这个⽠”了即:V 3层架构中”表现层”aspx页⾯对应MVC中View(继承的类不⼀样)
C 三层架构中”表现层”的aspx.cs页⾯(类)对应MVC中的Controller,理解这⼀点并不难,⼤家想⼀想我们以前写过的 Redirect,当然它本⾝就是跳转了⼀些链接页⾯,⽽MVC中的Controller要做的更爽,它控制并显⽰输出了⼀个视图。即然所起到的作⽤都是对业务流程和显⽰信息的控制,只不过是实现⼿段不同⽽已。
M 3层架构中业务逻辑层和数据访问层对应MVC中Model(必定View和Controller已到“婆家”剩下Model只能是业务逻辑层和数据访问层了)
为什么要使⽤ MVC⼤部分Web应⽤程序都是⽤像ASP,PHP,或者CFML这样的过程化(⾃PHP5.0版本后已全⾯⽀持⾯向对象模型)语⾔来创建的。它们将像数据库查询语句这样的数据层代码和像HTML这样的表⽰层代码混在⼀起。经验⽐较丰富的开发者会将数据从表⽰层分离开来,但这通常不是很容易做到的,它需要精⼼的计划和不断的尝试。MVC从根本上强制性的将它们分开。尽管构造MVC应⽤程序需要⼀些额外的⼯作,但是它给我们带来的好处是⽆庸质疑的。
⾸先,最重要的⼀点是多个视图能共享⼀个模型,现在需要⽤越来越多的⽅式来访问你的应⽤程序。对此,其中⼀个解决之道是使⽤MVC,⽆论你的⽤户想要Flash界⾯或是 WAP 界⾯;⽤⼀个模型就能处理它们。由于你已经将数据和业务规则从表⽰层分开,所以你可以最⼤化的重⽤你的代码了。
由于模型返回的数据没有进⾏格式化,所以同样的构件能被不同界⾯使⽤。例如,很多数据可能⽤HT
ML来表⽰,但是它们也有可能要⽤Adobe Flash和WAP来表⽰。模型也有状态管理和数据持久性处理的功能,例如,基于会话的购物车和电⼦商务过程也能被Flash⽹站或者⽆线联⽹的应⽤程序所重⽤。
因为模型是⾃包含的,并且与控制器和视图相分离,所以很容易改变你的应⽤程序的数据层和业务规则。如果你想把你的数据库从MySQL移植到Oracle,或者改变你的基于RDBMS数据源到LDAP,只需改变你的模型即可。⼀旦你正确的实现了模型,不管你的数据来⾃数据库或是LDAP服务器,视图将会正确的显⽰它们。由于运⽤MVC的应⽤程序的三个部件是相互独⽴,改变其中⼀个不会影响其它两个,所以依据这种设计思想你能构造良好的松耦合的构件。
对我来说,控制器也提供了⼀个好处,就是可以使⽤控制器来联接不同的模型和视图去完成⽤户的需求,这样控制器可以为构造应⽤程序提供强有⼒的⼿段。给定⼀些可重⽤的模型和视图,控制器可以根据⽤户的需求选择模型进⾏处理,然后选择视图将处理结果显⽰给⽤户。
拿⼀个简单的登陆模块说,需求是你输⼊⼀个⽤户名、密码,如果输⼊的跟预先定义好的⼀样,那么就进⼊到正确页⾯,如果不⼀样,就提⽰个错误信息。
V 这个⼩⼩的模块中,起始的输⼊⽤户名密码的页⾯跟经过校验后显⽰的页⾯就相当于View C ⽽这⾥还需要⼀个controller页⾯,就是⽤于接收输⼊进来的⽤户名密码,还有经过校验后返回的⼀个flg(此flg就是⽤于判断你输⼊的是否正确,⽽跳转到相应的页⾯的)
M 最后还缺⼀个Model,那么就是你那个⽤于校验的类了,他就是处理你输⼊的是否跟预先订好的⼀样不⼀样的,之后返回⼀个flg.这样就完全实现了逻辑跟页⾯的分离,我页⾯不管你咋整,反正我就⼀个显⽰,⽽controller呢也不管你Model咋判断对不对,反正我给你了⽤户名跟密码,你就得给我整回来⼀个flg来,⽽Medol呢,则是反正你敢给我个⽤户名跟密码,我就给你整过去个flg
m 提供数据,数据之间的关系,转化等。并可以通知视图和控制器⾃⼰哪些地⽅发⽣了变化。
v 提供显⽰,能根据m的改变来更新⾃⼰c ⽐如视图做了点击⼀个按钮,会先发给这个视图的控制器,然后这个控制器来决定做什么操作(让模型更新数据,控制视图改变)
mvc是⼀个复合模式mv,mc都是观察者模式m内部的组件组合模式vc之间是策略模式(可以随时更换不同的控制器)
————————————-
MVC模式是上世纪70年代提出,最初⽤于Smalltalk平台上的。
MVC是表现模式,是⽤来向⽤户展现的许多组建的⼀个模式(UI/Presentation Patten)
MVC有三种⾓⾊:Model:⽤来储存数据的组件(与领域模型概念不同,两者会相互交叉)
View:从Model中获取数据进⾏内容展⽰的组件。同样的Model在不同的View下可展⽰不同的效果。获取Model的状态,⽽不对其进⾏操作。
Controller:接受并处理⽤户指令(操作Model(业务)),选择⼀个View进⾏操作。
MVC概述:协作存在单向引⽤,例如Model不知道View和Controller的存在。View不知道Controller的存在。这就隔离了表现和数据。View和controller是单向引⽤。⽽实际中View和Controller也是有数据交互的。
MVC的重要特点是分离。两种分离:View和数据(Model)的分离使⽤不同的View对相同的数据进⾏展⽰;分离可视和不可视的组件,能够对Model进⾏独⽴测试。因为分离了可视组件减少了外部依赖利于测试。(数据库也是⼀种外部组件)
View和表现逻辑(Controller)的分离Controller是⼀个表现逻辑的组件,并⾮⼀个业务逻辑组件。MVC可以作为表现模式也可以作为建构模式,意味这Controller也可以是业务逻辑。分离逻辑和具体展⽰,能够对逻辑进⾏独⽴测试。
MVC和三层架构MVC与三层架构类似么?
View-UI Layer | Controller-Bussiness Layer | Model-Data Access Layer其实这样是错误的MVC是表
现模式(Presentation Pattern)
三层架构是典型的架构模式(Architecture Pattern)
三层架构的分层模式是典型的上下关系,上层依赖于下层。但MVC作为表现模式是不存在上下关系的,⽽是相互协作关系。即使将MVC当作架构模式,也不是分层模式。MVC和三层架构基本没有可⽐性,是应⽤于不同领域的技术。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论