MVC和三层架构的区别


  首先,MVC和三层架构,是不一样的。

  三层架构是典型的架构模式(Architecture Pattern)
 
  三层架构中,将整个业务应用划分为
    a.表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
    b.业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
    c.数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。


  三层架构的分层模式是典型的上下关系,上层依赖于下层。意在职责分离。即为了“高内聚,低耦合”的思想。但MVC作为表现模式是不存在上下关系的,而是相互协作关系。即使将MVC当作架构模式,也不是分层模式。MVC和三层架构基本没有可比性,是应用于不同领域的技术。

 MVC是一个复合模式mv,mc都是观察者模式m内部的组件组合模式vc之间是策略模式(可以随时更换不同的控制器)严格说el-View-Controller这三个加起来以后才是三层架构中的WEB层,也就是说,MVC把三层架构中的WEB层再度进行了分化,分成了控制器、视图、实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话;而C层直接与三层中的BLL进行对话。

 MVC的重要特点是分离。两种分离:View和数据(Model)的分离使用不同的View对相同的数据进行展示;分离可视和不可视的组件,能够对Model进行独立测试。因为分离了可视组件减少了外部依赖利于测试。(数据库也是一种外部组件)

 View和表现逻辑(Controller)的分离Controller是一个表现逻辑的组件,并非一个业务逻辑组件。MVC可以作为表现模式也可以作为建构模式,意味这Controller也可以是业务逻辑。分离逻辑和具体展示,能够对逻辑进行独立测试。


 其实三层架构是N层结构的一种,是软件抽象的层次结构,是对复杂软件的一种纵向切分,每一层次中完成同一类型的操作,以便将各种代码以其完成的使命作为依据来分割,以将低软件的复杂度,提高其可维护性。一般来说,层次之间是向下依赖的,下层代码未确定其接口(契约)前,上层代码是无法开发的,下层代码接口(契约)的变化将使上层的代码一起变化。三层结构是N层结构的一种,是人产在长时间使用中得出来的一种应用场合广泛的N层结构,被当作一种典型的软件层次结构而广为流传甚至写入教科书。

    MVC模式是一种复合设计模式,一种在特定场合用于解决某种实际问题来得出的可以反复实践的解决方案。巧合的是他也有三个事物组成,于是人们就有了一种想当然的对应关系:展示层-View;业务逻辑层-Control;持久层-Model。首先MVC中的三个事物之间并不存在明显的层次结构,没有明显的向下依赖关系,相反的,View和Model往往是比较独立的,而Control是连接两者的桥梁,他们更像是横向的切分。这样一来就出现一个结果,MVC中每个块都是可以独立测试的,而三层结构中,上层模块的运行测试势必要提供下层代码或者提供相同接口的桩。相对来说,MVC复杂得多,但是结构更清晰,耦合性更低。

    另外,MVC中每一块内部特别是Model内部经常被设计为多层的。在我认为的一个良好的MVC模式构建的结构中,Control是核心,小且较为稳定的,可以作为一个核心框架来提供,有扩展点,但基本上可以简单配置不需要任何代码就可以运行。而View则可能是一套或多种可选择的视图引擎,决定了软件展示给用于的界面,使用时的主要工作量在于扩展点以及根据需要而数量不同的视图模板。Model则是业务提供者,决定了软件提供的功能,其内部可能是一些普通的类或者是实现了某些接口的类,在这一块当中可能根据业务的不同而色彩缤纷,对于复杂的软件可能会分成很多层,如业务逻辑层、业务提供层、系统提供层、数据提供层、数据访问层等。

 

MVC三层架构有着类似的思想,都是分层、解耦,但两者也存在明显的区别。 ### 概念侧重点 MVC是一种复合设计模式,可归于表示模式,关注于应用内部的组织交互,包含模型(处理数据逻辑)、视图(用户界面展示)控制器(处理用户输入业务逻辑)三个主要组件,基于页面来分[^1][^2]。三层架构是一种软件架构,可归于部署模式,更强调整体应用的分层设计功能划分,由表现层(用户界面)、业务逻辑层(处理业务逻辑)数据访问层(与数据存储交互)三个层次组成,基于业务逻辑来分[^1][^2]。 ### 关系 MVC三层架构可以相互结合使用。在实际开发中,三层架构的表现层可以使用MVC模式来进行设计。例如,表现层接收用户请求,其中的控制器接收请求后调用业务逻辑层进行处理,业务逻辑层处理完成后返回结果给控制器,控制器再将结果传递给视图进行展示。而业务逻辑层数据访问层则按照三层架构的设计进行开发,实现业务逻辑数据访问的分离。 ### 代码示例 以下是一个简单的示例,展示了MVC三层架构的结合使用。 #### 数据访问层(DAO层) ```java // 假设这是一个产品的数据访问接口 public interface ProductDao { List<Product> selectAll(); } // 实现类 public class ProductDaoImpl implements ProductDao { @Override public List<Product> selectAll() { // 这里实现具体的数据查询逻辑,例如从数据库查询 return new ArrayList<>(); } } ``` #### 业务逻辑层(Service层) ```java // 业务逻辑层接口 public interface ProductService { List<Product> selectAll(); } // 实现类 public class ProductServiceImpl implements ProductService { private ProductDao productDao = new ProductDaoImpl(); @Override public List<Product> selectAll() { return productDao.selectAll(); } } ``` #### 表现层(MVC) ```java // 控制器类 import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class ProductController { private ProductService productService = new ProductServiceImpl(); @GetMapping("/products") public String showProducts(Model model) { List<Product> products = productService.selectAll(); model.addAttribute("products", products); return "productView"; } } // 视图(假设使用JSP) <!-- productView.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Product List</title> </head> <body> <h1>Product List</h1> <ul> <c:forEach items="${products}" var="product"> <li>${product.name}</li> </c:forEach> </ul> </body> </html> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值