MVC架构模式详细说明
⼀、简介:
  架构模式是⼀个通⽤的、可重⽤的解决⽅案,⽤于在给定上下⽂中的软件体系结构中经常出现的问题。架构模式与软件设计模式类似,但具有更⼴泛的范围。
  模型-视图-控制器模式,也称为MVC模式(Model View Controller)。⽤⼀种业务逻辑、数据、界⾯显⽰分离的⽅法组织代码,将业务逻辑聚集到⼀个部件⾥⾯,在改进和个性化定制界⾯及⽤户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来⽤于映射传统的输⼊、处理和输出功能在⼀个逻辑的图形化⽤户界⾯的结构中。它把软件系统分为三个基本部分:
    模型(Model):负责存储系统的中⼼数据。
    视图(View):将信息显⽰给⽤户(可以定义多个视图)。
    控制器(Controller):处理⽤户输⼊的信息。负责从视图读取数据,控制⽤户输⼊,并向模型发送数据,是应⽤程序中处理⽤户交互的部分。负责管理与⽤户交互交互控制。
  视图和控制器共同构成了⽤户接⼝。
  且每个视图都有⼀个相关的控制器组件。控制器接受输⼊,通常作为将⿏标移动、⿏标按钮的活动或键盘输⼊编码的时间。时间被翻译成模型或试图的服务器请求。⽤户仅仅通过控制器与系统交互。
⼆、结构
  模型组件包含应⽤程序的功能内核,他封装了相应的数据并输出执⾏特定应⽤程序处理的过程;模型也提供访问数据的函数,这些数据有获得待显⽰的数据的视图组件使⽤。
  控制器代表⽤户调⽤所有这些过程。
三、⽬的
  实现⼀种动态的程序设计,是后序对程序的修改和扩展简化,并且使程序某⼀部分的重复利⽤称为可能。
  通过对复杂度的简化,使程序结构更加直观。
  将信息的内部表⽰与信息的呈现⽅式分离开来,并接受⽤户的请求。它分离了组件,并允许有效的代码重⽤。即,将模型和视图的实现代码分离,从⽽使同⼀个程序可以使⽤不同的表现形式。⽐如⼀批统计数据你可以分别⽤柱状图、饼图来表⽰。C存在的⽬的则是确保模型和视图的同步,⼀旦模型改变,视图应该同步更新。
四、特点
  MVC重要特点就是两种分离:
  视图和数据模型的分离:使⽤不同的视图对相同的数据进⾏展⽰;分离可视和不可视的组件,能够对模型进⾏独⽴测试。因为分离了可视组件减少了外部依赖利于测试。(数据库也是⼀种外部组件)
  视图和表现逻辑(Controller)的分离:Controller是⼀个表现逻辑的组件,并⾮⼀个业务逻辑组件。MVC可以作为表现模式也可以作为建构模式,意味这Controller也可以是业务逻辑。分离逻辑和具体展⽰,能够对逻辑进⾏独⽴测试。
  优点:耦合性低;重⽤性⾼;⽣命周期成本低;部署块;可维护性⾼;有利软件⼯程化管理。
  缺点:没有明确的定义;不适合⼩型,中等规模的应⽤程序;增加系统结构和实现的复⽤性;视图与控制器间的过于紧密的连接;视图对模型数据的低效率访问;⼀般⾼级的界⾯⼯具或构造器不⽀持模式。
五、特定环境
  ⼤的项⽬;需要划分模块的项⽬。
六、解决的问题
  因为在PHP还不⽀持⾯向对象之前,是过程化的⽅式来创建的,它们将 Model View Controller 三层的代码混在⼀起,⼗分混乱。所以它解决的问题有:维护难,开发速度慢,⼆次开发难度⾼,⼯作量⼤,代码复⽤,耦合度⾼,系统不灵活。
七、解决⽅案
  以我的理解,将项⽬模块化,分为三个部分:模型,视图和控制器三个部分。模型是应⽤对象,没有⽤户界⾯。视图表⽰它在屏幕上的显⽰,代表流向⽤户的数据。控制器定义⽤户界⾯对⽤户输⼊的响应⽅式,负责把⽤户的动作转成针对Model的操作。Model 通过更新View的数据来反映数据的变化。
⼋、实例
  应⽤于基于MVC架构模式的框架,常见的服务器端MVC框架有:Struts、Spring MVC、ASP.NET MVC、Zend Framework、JSF;常见前端MVC框架:angularjs、reactjs、backbone;由MVC演化出了另外⼀些模式如:MVP、MVVM。
  这⾥我们举例Spring MVC:
  Spring MVC是Spring提供的⼀个强⼤⽽灵活的web框架。借助于注解,Spring MVC提供了⼏乎是POJO的开发模式,使得控制器的开发和测试更加简单。这些控制器⼀般不直接处理请求,⽽是将其委
托给Spring上下⽂中的其他bean,通过Spring的依赖注⼊功能,这些bean被注⼊到控制器中。Spring MVC主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成。他的两个核⼼是两个核⼼:
  处理器映射:选择使⽤哪个控制器来处理请求
  视图解析器:选择结果应该如何渲染
  通过以上两点,Spring MVC保证了如何选择控制处理请求和如何选择视图展现输出之间的松耦合。
  运⾏原理如图所⽰:
(1)Http请求:客户端请求提交到DispatcherServlet。
(2)寻处理器:由DispatcherServlet控制器查询⼀个或多个HandlerMapping,到处理请求的Controller。
(3)调⽤处理器:DispatcherServlet将请求提交到Controller。
(4)(5)调⽤业务处理和返回结果:Controller调⽤业务逻辑处理后,返回ModelAndView。
(6)(7)处理视图映射并返回模型: DispatcherServlet查询⼀个或多个ViewResoler视图解析器,到ModelAndView指定的视图。(8) Http响应:视图负责将结果显⽰到客户端。
 Spring MVC框架与MVC架构模式联系在于:mvc的controller
  SpringMVC中并没有涉及有关于Controller接⼝规范的实现,SpringMVC是通过调⽤Handler来实现Controller这⼀层的。
  SpringMVC使⽤了适配器模式,前端控制器使⽤HandlerAdapter来调⽤不同的Controller,然后才是Controller调⽤Model产⽣数据模型;
  产⽣的数据模型将会再次返回到前端控制器,并由前端控制器决定使⽤不同的模板引擎将页⾯进⾏渲染。
九、MVC架构模式与分层模式的区别
  MVC模式属于设计模式的范畴,就如同其他设计模式⼀样,模式的出现就是为了对某种功能的优化,⽽MVC模式可以看做是对三层架构中表现层的⼀种细分优化。以我的理解,MVC模式就是分层模式中表⽰层最常⽤的架构模式。
  详细阐述如下:
  严格说这三个加起来以后才是三层架构中的表现层,也就是说,MVC把三层架构中的UI层再度进⾏了分化,分成了控制器、视图、实体三个部分,控制器完成页⾯逻辑,通过实体来与界⾯层完成通话;⽽C层直接与三层中的业务逻辑层进⾏对话。三层和MVC可以共存。三层是基于业务逻辑来分的,⽽MVC是基于页⾯来分的。
  三层架构的分层模式是典型的上下关系,上层依赖于下层。但MVC作为表现模式是不存在上下关系的,⽽是相互协作关系。即使将MVC当作架构模式,也不是分层模式。MVC和三层架构基本没有可⽐性,是应⽤于不同领域的技术。
⼗、MVC架构模式与MVC框架的区别
  MVC框架,强制性的使应⽤程序输⼊、处理和输出分开。使⽤MVC应⽤程序被分成三个核⼼部件:模型、视图、控制器。它们各⾃处理⾃⼰的任务。其所使⽤的三个核⼼部件都是来时MVC模式的。只不过在框架中让他们彼此更加独⽴了去处理各⾃的任务⽽已。最典型的MVC就是JSP+SERVLET+JAVABEAN模式。
  MCV框架中:
  视图:视图是⽤户看到并与之交互的界⾯,视图的主要有元素HTML,Adobe Flash,XHTML,XML/XSL,WML等⼀些标识语⾔和Web services。
  模型:模型数据和业务规则。
  控制器:控制器接受⽤户的输⼊并调⽤模型和视图去完成⽤户的需求,所以当单击Web页⾯中的超链接和发送HTML表单时,控制器本⾝不输出任何东西和做任何处理。它只是接收请求并决定  调⽤哪个模型构件去处理请求,然后再确定⽤哪个视图来显⽰返回的数据。
⼗⼀、MVC架构模式的举例说明
  例如①,⼩时候玩的那种卡带式游戏机,Control是主机,⼀般来说我买⼀个主机就⾏了,只要他不坏,他就能⼀直让我玩这⼀类的游戏。View则是电视机和游戏⼿柄,电视机可以独⽴⼯作,他不管输⼊的是电视信号、影碟机信号还是游戏机信号,他只管显⽰,⽽且他决定了我们看到的效果是怎么样的,如果我想要个尺⼨更⼤的或者彩⾊的显⽰效果,我只需要买个相应的电视机就⾏了,⼿柄也是可以换的,遥杆还是带震动的。Model则是游戏卡带,他决定了我玩的是什么游戏,是魂⽃罗还是超级玛莉,⽽且游戏机主机和电视机⽣产⼚家永远也不知道在上⾯有可能会运⾏什么样的游戏。卡带中可能会有游戏代码和存储单元,都根据游戏的需要⽽设计。
  例如②,⼀个采⽤⽐例表⽰的⽤于政治选举的⼀个简单信息系统,它提供了⼀个输⼊数据的电⼦数据表和表⽰当前结果的⼏种图标。⽤户可以通过图形接⼝与系统交互。所有信息显⽰必须⽴即反应出选举数据的变化。(引⽤⾃《⾯向模式的软件体系结构-卷1 模式系统》)
  即,⼀旦模型的数据发⽣了变化,模型要通报所有的视图。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。