将系统按职责分为多个水平层,每层只与相邻层交互:
┌─────────────────────────────┐
│ 表现层 (Presentation) │ ← 用户界面
├─────────────────────────────┤
│ 业务层 (Business) │ ← 业务逻辑
├─────────────────────────────┤
│ 持久层 (Persistence) │ ← 数据访问
├─────────────────────────────┤
│ 数据库层 (Database) │ ← 数据存储
└─────────────────────────────┘
| 原则 | 说明 |
|---|
| 单向依赖 | 上层依赖下层,下层不依赖上层 |
| 隔离变化 | 层内变化不影响其他层 |
| 关注点分离 | 每层只关注自己的职责 |
| 可替换性 | 每层可独立替换实现 |
| 职责 | 说明 |
|---|
| 用户交互 | 接收用户输入 |
| 数据展示 | 格式化输出 |
| 请求路由 | 分发请求到业务层 |
| 输入验证 | 基本格式校验 |
| 职责 | 说明 |
|---|
| 业务逻辑 | 核心业务规则 |
| 流程编排 | 协调多个服务 |
| 事务管理 | 保证数据一致性 |
| 权限控制 | 业务级权限 |
| 职责 | 说明 |
|---|
| 数据访问 | CRUD操作 |
| ORM映射 | 对象-关系映射 |
| 查询优化 | SQL优化 |
| 缓存管理 | 数据缓存 |
每层只能调用直接下层:
表现层 → 业务层 → 持久层 → 数据库
允许跨层调用(如表现层直接调用持久层进行简单查询):
表现层 → 业务层 → 持久层 → 数据库
│ ↑
└──────────────┘ (简单查询可跳过业务层)
| 模式 | 层次 | 示例 |
|---|
| 三层架构 | 表现-业务-数据 | Java EE |
| 四层架构 | 表现-应用-领域-基础设施 | DDD |
| 六边形架构 | 核心+适配器 | Alistair Cockburn |
| 洋葱架构 | 领域核心+多层环绕 | Jeffrey Palermo |
- 简单易懂:团队快速上手
- 关注点分离:各层职责清晰
- 可测试性:每层可独立测试
- 标准化:业界广泛采用
- 性能开销:多层调用增加延迟
- 过度抽象:简单功能也需经过所有层
- 腐化风险:层间边界容易被打破
- 单体倾向:容易变成大泥球
| 实践 | 说明 |
|---|
| DTO转换 | 层间使用DTO而非暴露领域模型 |
| 依赖倒置 | 业务层定义接口,持久层实现 |
| 防腐层 | 外部系统集成使用适配器 |
| 统一异常处理 | 每层转换异常类型 |
| 日志规范 | 每层记录适当级别的日志 |