分层架构 考试重点
经典架构模式
将系统组织为层次结构,每层只调用下层服务,是最常见的软件体系结构风格。
结构示意
flowchart TB
UI[表示层 Presentation]
BIZ[业务逻辑层 Business]
DAO[数据访问层 Persistence]
DB[(数据库)]
UI --> BIZ --> DAO --> DB
讲解视频
知识说明
分层架构把系统按抽象级别切成若干层:上层依赖下层,下层不依赖上层。Web 系统最常见的是表示层、业务逻辑层、数据访问层。
核心约束:不允许「跨层调用」和「下层回调上层」,从而控制依赖方向。代价是请求可能经过多层转发,带来一定性能开销。
考试与设计时抓住三点:各层职责、依赖规则、与 MVC 的关系(MVC 常落在表示层内部,整体仍是分层)。
特点
- 层次分明
- 单向依赖
- 职责清晰
- 便于替换某一层实现
优点
- 结构清晰,易于理解
- 可分层开发与测试
- 便于维护和替换技术栈
局限
- 层层转发带来性能开销
- 严格分层时跨层查询别扭
- 层数过多会产生空洞层
适用
Web 应用 企业信息系统 操作系统 数据库系统内部
例子展示 —— 校园选课系统的三层划分
问题
选课、查成绩、排课如果全部写在 Servlet/页面里,SQL 与界面缠在一起,改库表就要改一堆页面。
做法
表示层只处理 HTTP/页面;CourseService 负责「能否选课、学分上限」等规则;CourseDao 只做增删改查。换 MyBatis 或换前端时,其它层可保持稳定。
flowchart LR
C[CourseController] --> S[CourseService]
S --> D[CourseDao]
D --> DB[(course_selection)]
public class CourseController {
private final CourseService service = new CourseService();
public void select(int studentId, String courseId) {
service.selectCourse(studentId, courseId);
}
}
public class CourseService {
private final CourseDao dao = new CourseDao();
public void selectCourse(int studentId, String courseId) {
if (dao.countSelected(studentId) >= 8)
throw new IllegalStateException("超出选课上限");
dao.insertSelection(studentId, courseId);
}
}
public class CourseDao {
public int countSelected(int studentId) { /* JDBC/SQL */ return 0; }
public void insertSelection(int studentId, String courseId) { /* SQL */ }
}
class CourseService:
def __init__(self, dao):
self.dao = dao
def select_course(self, student_id, course_id):
if self.dao.count_selected(student_id) >= 8:
raise ValueError("超出选课上限")
self.dao.insert_selection(student_id, course_id)