分层架构 考试重点

经典架构模式

将系统组织为层次结构,每层只调用下层服务,是最常见的软件体系结构风格。

结构示意
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)