一、 三层架构(Layered Architecture):后端逻辑的纵向切分
这是我们写 Java 后端代码时最常用 的逻辑分层,它侧重于后端内部的职责划分。
当你接到一个任务,你需要把代码"垂直"地切成三层:
- 表现层 / 控制层 (Controller) :
- 职责:负责接客。接收用户的 HTTP 请求,解析参数,最终把处理好的结果返回给用户。
- 业务逻辑层 (Service) :
- 职责 :负责干活。这里是项目的核心,比如判断逻辑、计算逻辑、事务控制(比如转账时,A减钱和B加钱必须同时成功)。
- 数据访问层 (DAO/Mapper) :
- 职责:负责沟通。专门处理与数据库(MySQL等)的交接工作,执行 SQL 语句。
为什么要分这三层? 主要是为了业务逻辑的内聚。如果某一天你要把网页换成手机 App,由于业务逻辑都封装在 Service 层里,你只需要新写一个 Controller,Service 层代码完全不用动。
二、 MVC 模式:网页开发的横向切分
MVC 则更侧重于 Web 整体的交互结构,它描述的是"用户看到什么"到"后台处理什么"的过程:
- Model (模型) :即数据。对应我们的 Domain(实体类)和 DAO 层。它负责维护数据的状态和规则。
- View (视图) :即界面。你在浏览器里看到的 HTML、JSP、或者前端页面(Vue/React)。它负责展示数据。
- Controller (控制器) :即中转站。它连接 Model 和 View。当用户点击页面(View)时,Controller 接收请求,去操作数据(Model),然后把数据更新到页面上。
三、 它们的联系与区别
虽然很多时候我们混着说,但它们的区别很关键:
| 特性 | 三层架构 | MVC 模式 |
|---|---|---|
| 侧重点 | 关注代码的组织和耦合度 | 关注交互逻辑的实现 |
| 层级关系 | 纵向:Controller -> Service -> DAO | 横向:View -> Controller -> Model |
| 核心目的 | 逻辑分离,方便代码复用和维护 | 组件分离,实现数据展示与处理逻辑解耦 |
在现代开发中的融合:
现在的 Java 开发(特别是前后端分离项目)通常这样结合:
- 后端 :严格遵循 Controller -> Service -> DAO 的三层架构,负责处理纯逻辑;
- 前端:自行实现 MVC 或 MVVM 架构(比如 Vue),处理页面的展示逻辑。
如何形象理解?
你可以把一个餐厅订单系统看作这样:
- View (MVC):菜单和点餐界面(展示给用户)。
- Controller (MVC/三层):服务员。他接收你的点餐要求(接收请求),但他不负责炒菜。
- Service (三层):厨师。他掌握炒菜的流程(业务逻辑),比如先热锅、后下料。他也不会直接去地窖取菜,而是吩咐配菜员。
- DAO (三层):配菜员(Mapper)。他只负责从地窖(数据库)里把食材(数据记录)取出来交给厨师。
为什么要这么折腾?
因为如果厨师既要热锅,又要去地窖挖土豆,还要去前台招呼客人,餐厅一旦客流量大,服务员一旦生病,整个餐厅就瘫痪了。分层之后,餐厅的各个模块可以独立运行、方便替换,这才是软件架构最核心的魅力所在。
二者容易产生混淆,是因为 MVC 和 三层架构 是从不同的维度对程序进行拆分的。
它们是两套不同的"切分蛋糕"的方法,经常被组合在一起使用。
我们来理清一下它们的层级关系:
1. MVC 是"横向"的架构(关注用户交互)
MVC 是为了把用户看到的 和数据存储的切分开:
- View (视图层): 也就是前端页面,用户看到的东西。
- Controller (控制层): 它是"交通警察"。它负责接收 View 的请求,调用 Model 处理数据,再决定把什么 View 渲染给用户。
- Model (模型层): 这里比较宽泛,它代表了数据结构与业务逻辑。
2. 三层架构 是"纵向"的细化(关注后端功能)
为了让 MVC 中的 Model 部分不那么臃肿,后端工程师把 Model 拆成了"三层":
- Controller (这一层属于 MVC 的 C): 接口接收层。
- Service (业务逻辑层): 专门处理复杂的业务逻辑(这就是三层架构的第二层)。
- DAO/Mapper (数据访问层): 专门负责和数据库读写交互(这就是三层架构的第三层)。
总结:它们的关系图
你可以把 MVC 看作一个大骨架,把三层架构看作骨架内部的肌肉组织:
| MVC 分层 | 对应三层架构中的角色 | 主要职责 |
|---|---|---|
| View | (独立存在) | 负责展示数据 (HTML, React/Vue 等) |
| Controller | Controller | 负责请求调度,不写复杂的业务逻辑 |
| Model | Service + DAO | Service: 处理计算和判断;DAO: 负责和数据库交互 |
关键点总结:
- MVC 不是三层 ,它是三部分的组合;"三层架构"指的是 Controller/Service/DAO 这三块的层级关系。
- 在现代 Web 开发中(比如 Spring Boot 项目),我们通常会把 MVC 中的 Model 用"三层架构"的方式拆解开。
- 所以,Controller 既是 MVC 的 C,也是三层架构的顶层 ;而 Service 和 DAO 则是 MVC 中 M 的进一步精细化拆分,并不是每一层都叫"三层"。
一句话总结:
MVC 告诉你"要把显示、逻辑、数据分开",而三层架构告诉你"后台的逻辑和数据具体该怎么分工"。
这两个概念的"重叠部分"需要理清楚。