本页目录 · 5 节
第 13 章 层次式架构设计理论与实践
对应大纲:科目 1-12 层次式架构设计理论与实践|教材 P451–P481|优先级 ★★★★|综合知识估分 2~4 分
读法:把「表现层—中间层—数据访问层—数据层」当成一条纵向流水线,每层只记「职责 + 模式 + 一个案例」;MVC 三兄弟和 5 种数据访问模式是最稳的得分点。
一、知识框架
层次式架构设计理论与实践
├─ 13.1 概述:表现层|中间层|数据访问层|数据层
├─ 13.2 表现层框架设计
│ ├─ 设计模式:MVC|MVP|MVVM
│ ├─ XML 统一外观
│ ├─ UIP 思想
│ └─ 动态生成
├─ 13.3 中间层架构设计
│ ├─ 业务逻辑组件:事务脚本|领域模型|表模块
│ ├─ 工作流:参考模型与引擎
│ ├─ 实体:实体类与实体集合
│ └─ 框架:Spring、.NET
├─ 13.4 数据访问层设计
│ ├─ 5 种模式:在线访问|DAO|DTO|离线数据|ORM
│ ├─ 工厂模式
│ ├─ ORM 与 Hibernate
│ ├─ XML Schema
│ ├─ 事务处理:ACID|2PC
│ └─ 连接对象管理
├─ 13.5 数据架构规划与设计
│ ├─ 数据库设计与类设计融合
│ └─ 与 XML 设计融合
├─ 13.6 物联网层次架构:感知/网络/应用
└─ 13.7 案例分析:PetShop|电子小票
二、必背要点
13.1 层次式体系结构概述
| 层次 | 职责 | 典型技术 |
|---|---|---|
| 表现层 | 界面展示、人机交互、输入校验 | JSP、Vue/React、WPF |
| 中间层 | 业务规则、流程编排、事务边界 | Spring Service、EJB、BLL |
| 数据访问层 | 屏蔽数据库差异、CRUD、对象映射 | MyBatis、Hibernate、ADO.NET |
| 数据层 | 持久化存储 | 关系库、NoSQL、文件系统 |
优点:关注点分离、层间松耦合、每层可独立替换。
缺点:调用链长有性能损耗;需求可能穿透多层造成级联修改;过度分层增加复杂度。
分层原则:上层依赖下层且依赖抽象;跨层调用须经接口或门面;禁止下层反向依赖。
13.2 表现层框架设计
三种表现层模式
| 模式 | 组成与交互 | 适用 |
|---|---|---|
| MVC | View 可读 Model,Controller 接收请求并调度 | Web、桌面应用 |
| MVP | View 与 Model 完全隔离,全部经 Presenter | 界面测试要求高的客户端 |
| MVVM | View 与 ViewModel 双向绑定,自动同步 | 富前端(WPF、Vue) |
一句话区分:MVC 的 View 能直接碰 Model;MVP 的 View 是哑视图,一切靠 Presenter;MVVM 用数据绑定省掉手写同步。
XML 统一外观:把控件样式、布局、颜色抽到 XML 配置,由外观引擎统一渲染,实现「一套逻辑、多套皮肤」。
UIP 思想:把界面导航与流程控制从页面中抽出,形成独立的界面过程组件;页面只负责展示,流程由 UIP 统一调度,便于流程复用与多端一致。
动态生成:依据元数据或配置在运行时生成表单、列表、菜单,减少重复编码、适应需求频变;代价是调试难、性能有损耗。
13.3 中间层架构设计
业务逻辑组件的三种组织方式
| 类型 | 组织方式 | 适用 |
|---|---|---|
| 事务脚本 | 一个用例一个过程,直接操作数据 | 逻辑简单的小系统 |
| 领域模型 | 对象同时含状态与行为 | 逻辑复杂、需长期演进 |
| 表模块 | 一个类对应一张表,封装表内操作 | 以数据为中心、表结构稳定 |
工作流参考模型:WFMC 提出,含 5 类组件与 5 个接口。组件为流程定义工具、工作流执行服务(引擎)、客户端应用、被调用应用、管理监控工具;接口 1~5 分别连接引擎与流程定义工具、客户端应用、被调用应用、其他引擎、监控工具。
工作流引擎职责:解析流程定义、创建并调度实例、分派任务、持久化状态、处理超时与异常。
实体:实体类承载业务数据与行为,实体集合管理一组实体,通常与表或视图对应。与 DTO 的区别是实体有行为,DTO 只有数据。
框架:Spring、EJB、.NET 提供依赖注入、AOP、声明式事务与 MVC 集成,把横切关注点从业务代码剥离。
13.4 数据访问层设计
五种数据访问模式
| 模式 | 做法 | 优点 | 缺点 |
|---|---|---|---|
| 在线访问 | 每次直接连库、逐条操作 | 简单、实时 | 连接开销大、强耦合数据库 |
| DAO | 用接口封装数据访问实现 | 解耦、易替换、易测试 | 类数量增多 |
| DTO | 用纯数据对象跨层或远程传输 | 减少网络往返、聚合数据 | 需转换、可能冗余 |
| 离线数据模式 | 本地缓存数据集,断开后操作再同步 | 支持离线、减少长连接 | 并发冲突、同步复杂 |
| ORM | 对象与关系表自动映射 | 效率高、屏蔽数据库差异 | 复杂查询性能与可控性差 |
工厂模式的作用:把「创建哪个具体实现」从调用方移出,按配置返回不同数据库的 DAO 实现;业务层只依赖接口,换库只改配置与工厂,体现开闭原则,常与抽象工厂、反射配合。
ORM 与 Hibernate
| 优点 | 缺点 |
|---|---|
| 对象与关系模型自动映射 | 复杂查询生成的 SQL 难优化 |
| 屏蔽数据库方言,可移植 | SQL 不可控,调优困难 |
| 自带缓存、延迟加载、事务管理 | 大批量操作效率低 |
| 减少样板代码,开发效率高 | 学习成本与调试难度较高 |
XML Schema:用 XSD 定义 XML 的结构、元素顺序与数据类型,用于数据交换契约与报文校验;结合对象映射(OXM)可在 XML 与对象间双向转换。
事务处理:本地事务满足 ACID;隔离级别为读未提交、读已提交、可重复读、串行化,对应脏读、不可重复读、幻读。跨库用两阶段提交(2PC):准备阶段锁定资源并表决,提交阶段统一提交或回滚;缺点是同步阻塞、协调者单点、部分失败不一致,故有 3PC、TCC、SAGA。
连接对象管理:连接创建销毁开销大。连接池预建并复用连接,用最小空闲、最大连接、超时、回收、心跳等参数控制,提升吞吐并防泄漏。
13.5 数据架构规划与设计
数据库设计与类设计融合:对象有继承、多态、引用,关系只有表与主外键,存在阻抗不匹配。
| 对象概念 | 关系实现 |
|---|---|
| 类 | 表 |
| 属性 | 列 |
| 对象实例 | 行 |
| 继承 | 单表继承、具体表继承、类表继承 |
| 关联 | 外键或关联表 |
设计顺序:概念模型(E-R)→ 逻辑模型(范式)→ 物理模型(索引、分区);类设计并行,用 ORM 映射对齐,避免先建库再倒推对象。
与 XML 设计融合:XML 作交换格式,XSD 定义契约,XML 与对象、关系数据双向映射;适合同构系统用关系模型、异构系统用报文解耦。
13.6 物联网层次架构设计
| 层次 | 职责 | 典型技术 |
|---|---|---|
| 感知层 | 对象识别、数据采集、指令执行 | 传感器、RFID、二维码 |
| 网络层 | 数据传输与接入 | 以太网、WiFi、5G、NB-IoT |
| 应用层 | 数据处理与行业服务 | 云平台、大数据、AI、行业应用 |
公共支撑(设备管理、标识解析、安全)贯穿三层;边缘计算位于网络层与应用层之间。
13.7 案例分析
(1)PetShop
微软 .NET 的分层参考实现:Web 表现层、BLL 业务层、DAL 数据访问层、Model 实体层。DAL 采用接口 + 工厂,通过配置切换 SQL Server 与 Oracle 实现;用 SQLHelper 封装 ADO.NET。它体现分层、面向接口、工厂与依赖倒置,是「换库不改代码」的标准答案。
(2)电子小票
零售电子小票系统:表现层覆盖收银端与顾客小程序;中间层负责小票生成、优惠计算与退换货规则;数据访问层管理小票、商品、会员数据。小票样式用模板动态生成;高峰用消息队列削峰,小票号用分段或雪花算法保证唯一;打印与推送解耦,失败可重试。
三、易混淆概念对比
| A | B | 关键区别 |
|---|---|---|
| MVC | MVP | MVC 中 View 可读 Model;MVP 中 View 与 Model 完全隔离 |
| MVP | MVVM | MVP 靠 Presenter 手动同步;MVVM 靠双向绑定自动同步 |
| DAO | DTO | DAO 封装数据访问逻辑;DTO 只承载数据、不含行为 |
| DTO | 实体 | DTO 用于跨层传输、无业务行为;实体有状态也有业务行为 |
| ORM | DAO | ORM 是对象关系映射技术;DAO 是封装模式,可用 ORM 实现 |
| 事务脚本 | 领域模型 | 前者按用例写过程;后者用富对象建模业务 |
| 表模块 | 活动记录 | 表模块一个类管一张表;活动记录一行数据一个对象 |
| 2PC | TCC | 2PC 强一致、同步阻塞;TCC 靠业务补偿、最终一致 |
| 连接池 | 长连接 | 连接池复用多个连接对象;长连接是保持单条连接不断 |
| 分层架构 | 三层 C/S | 分层是逻辑职责划分;三层 C/S 还含部署与通信含义 |
| 物联网感知层 | 网络层 | 感知层负责采集与执行;网络层只负责传输接入 |
四、常见考法与出题角度
| 出题角度 | 典型问法 | 答题要点 | 易错提示 |
|---|---|---|---|
| 模式识别 | 「View 与 Model 完全隔离的是」 | MVP | MVC 的 View 可直接读 Model |
| 模式选型 | 「Vue 双向绑定属于哪种模式」 | MVVM | 不是 MVC |
| 层次职责 | 「输入校验一般放在哪层」 | 表现层;业务校验在中间层 | 不要一律推给数据库 |
| 业务组件 | 「逻辑复杂、需长期演进用」 | 领域模型 | 小系统才用事务脚本 |
| 工作流 | 「WFMC 参考模型有几个接口」 | 5 个 | 组件也是 5 类 |
| 数据访问 | 「屏蔽数据库差异、便于换库的是」 | DAO + 工厂 | 不是 DTO |
| ORM | 「ORM 的主要缺点」 | 复杂查询性能差、SQL 不可控 | 不是开发效率低 |
| 事务 | 「2PC 的缺点」 | 同步阻塞、协调者单点 | 不是不支持回滚 |
案例题角度:给一套业务系统,要求「指出分层问题并重构」。答题模板:先画四层 → 指出越层调用与职责错位 → 表现层引入 MVC/MVVM → 中间层抽服务与事务边界 → 数据访问层用 DAO+工厂+ORM → 补连接池与事务策略。
论文可用角度:可直接改写为——「在××系统中,表现层采用 MVVM 双向绑定,中间层按领域模型组织业务,数据访问层以 DAO 接口加工厂屏蔽数据库差异,数据库由 SQL Server 迁移到 MySQL 时仅修改配置,业务代码零改动。」
五、速记与自测
速记
- 四层:表、中、访、数
- MVC 族:MVC 可直连、MVP 全靠 P、MVVM 靠绑定
- 业务三件套:事务脚本、领域模型、表模块
- 数据访问五模式:在、DAO、DTO、离、ORM
- 事务:ACID 四性 + 2PC 两阶段
- 连接池:预建、复用、限流、回收
- 物联网三层:感、网、用
自测
- MVC、MVP、MVVM 三者的核心区别是什么?
- 数据访问层的 5 种模式是什么?工厂模式起什么作用?
- 两阶段提交的两个阶段各做什么?主要缺点是什么?
答案:1. MVC 的 View 可直接访问 Model;MVP 的 View 与 Model 完全隔离、经 Presenter 交互;MVVM 通过 View 与 ViewModel 双向绑定自动同步。2. 在线访问、DAO、DTO、离线数据模式、ORM;工厂按配置创建具体 DAO 实现,业务层只依赖接口,换库不改代码。3. 准备阶段各参与者锁定资源并表决,提交阶段统一提交或回滚;缺点是同步阻塞、协调者单点、部分提交失败导致不一致。