概述
- 从广义上来说,MVC模式与三层架构是没有联系的,但是在三层架构中,表示层通常会使用MVC模式进行构建。
- 经常使用的MVC框架有Spring MVC、Struts等。
系统架构
指整合应用系统程序大的结构。
早期计算机行业没有这个概念,随着互联网的兴起,微软在C#上市的一年(05年)提出这一词,利用petsshop做了一个案例介绍三层架构,自此有了架构的概念。
系统间的复杂度=系统间的耦合度:系统架构均是为了降低系统模块间的耦合度。
高内聚,低耦合
- 一个类只做一件事
比如日期管理工具类不应该出现四则运算相关的事,这是数学工具类的事,体现了最少知识原则。 - 一个方法只做一件事
体现了单一职责原则。 - 写只写一次
MVC
- 是一种设计模式,它分离了表现与交互。
- MVC模式是应用于三层架构中视图层的模式。
三个核心部件
- Model(模型)
- 承载数据,并对用户提交请求进行计算的模块。
- 位于最底下的一层
- 是应用程序中用于处理应用程序数据逻辑的部分,通常负责在数据库中存取数据。
- 模型分两种:
- 数据模型(数据承载Bean):指实体类(Entity),专门用于承载业务数据的,如Student、User等。
- 业务模型(业务处理Bean):指Service或Dao对象, 专门用于处理用户提交请求的。业务处理模型将视图层与三层架构联系起来。
- View(视图)
- 为用户提供使用界面,与用户直接进行交互。
- 位于最上面的一层
- 是应用程序中处理数据显示的部分,通常是依据模型数据创建的。
- 所有界面都是视图,不光是html,桌面应用也是视图,移动应用,如手表,手机,包括电视等都是视图,因为那里有交互。
- Controller(控制器)
- 用于将用户请求转发给相应的Model进行处理,并根据Model的计算结果向用户提供相应响应。
- 位于中间的一层
- 是应用程序中处理用户交互的部分,通常负责从视图读取数据,控制用户输入,并向模型发送数据。
- 处理请求做分发。
MVC架构程序的工作流程
- 用户通过View页面向服务端提出请求,可以是表单请求、超链接请求、AJAX请求等。
- 所有的终端用户请求被发送到控制器。
- 服务端的Controller控制器接在收到请求后对请求进行解析,找到相应的Model对用户请求进行处理。
- Model处理后,将处理结果再交给Controller。
- Controller在接到处理结果后,根据处理结果找到要向客户端发回的响应页面(View)。
- 页面经渲染(数据填充)后发送给客户端。
优点
1. 耦合性低
由于运用MVC的应用程序的三个部件是相互独立,改变其中一个不会影响其它两个,所以依据这种设计思想能构造良好的松耦合的构件。
2. 重用性高
因为MVC模式允许使用不同样式的视图来访问同一个服务器端的代码,而模型返回的数据没有进行格式化,这样应用于模型的代码只需写一次就可以被多个视图重用,所以实现了最大化地重用代码。
3. 成本低
MVC模式使开发和维护用户接口的技术含量降低。
4. 部署快
使用MVC模式使开发时间得到很大的缩减,它使程序员集中精力于业务逻辑或表现形式上。
5. 可维护性高
分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。
缺点
1. 没有明确的定义
要完全理解MVC并不是很容易,而且模型和视图的严格分离也给调试应用程序带来了一定的困难,每个构件在使用之前都需要经过彻底的测试。
2. 不适合中小规模的应用程序
花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。
3. 增加系统结构和实现的复杂性
对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
4. 视图与控制器间的过于紧密的连接
视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
5. 视图对模型数据的低效率访问
依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
6. 一般高级的界面工具或构造器不支持该模式
为适应MVC需要,改造这些工具和建立分离部件的代价是很高的,会造成MVC使用的困难。
MVC举例
- 最典型的MVC就是JavaBean+Serlvet+JSP模式
最开始用Servlet(服务器小程序)开发,Servlet既要处理业务逻辑,又要处理页面展示。
后来出现JSP(Java Server Page,Java服务器页面)处理页面展示,因为JSP就是Servlet,所以JSP也可以使用脚本<%%>
处理业务逻辑,但是为了降低耦合度所以不用。
JSP能把Servlet分离出来,所以它是一门技术,类似于C#(.net)的aspx:.net是开发平台,C#则是.net开发平台的一门程序设计语言,.net开发平台还可以用vb、js、C/C++等语言进行开发,.net平台提供了很多API,可以把它理解成CPU,它提供了很多指令,它的指令可以供外部调用从而组成一个程序、一个软件。
类似相应的关系:Java与.jsp
、C#与.aspx
、PHP与.php
。- JavaBean作为模型,既可以作为数据模型来封装业务数据,又可以作为业务逻辑模型来包含应用的业务操作。其中,数据模型用来存储或传递业务数据,而业务逻辑模型接收到控制器传过来的模型更新请求后,执行特定的业务逻辑处理,然后返回相应的执行结果。
- JSP作为表现层,负责提供页面为用户展示数据,并在适当的时候向控制器发出请求,请求模型进行更