系统架构设计师备考第34天——软件架构风格
一、软件架构风格概述
核心概念
-
定义
- 软件架构风格是描述特定应用领域中系统组织方式的惯用模式,定义了一个系统家族的词汇表(构件与连接件类型)和组合约束。
- 作用:提供领域内共有的结构和语义特性,指导模块与子系统的有效组织,促进设计重用(如“客户/服务器”模式无需细节即可理解系统结构)。
-
目标
- 实现体系结构级软件重用,通过统一架构模式支持不同系统的构建。
重点考点
- 架构风格 vs. 设计模式:
- 架构风格关注系统整体结构(高层抽象),设计模式解决局部问题(如对象交互)。
- 核心价值:提升设计复用性、降低沟通成本、加速系统开发。
典型考题
Q: 软件架构风格的核心目标是什么?
A: 实现体系结构级软件重用,通过统一模式指导系统组织,减少重复设计。
二、数据流体系结构风格
核心概念
-
特点
- 基于数据可用性触发指令执行,无程序计数器,执行顺序不确定(非冯·诺依曼结构)。
- 构件:数据处理单元;连接件:数据流通道。
-
子风格分类
- 批处理风格
- 特征:处理步骤为独立程序,需前一步完成且数据完整传递(整体性处理)。
- 示例:传统报表生成系统(数据全量处理)。
- 管道-过滤器风格
- 特征:过滤器逐级处理数据流,管道连接输入/输出(增量式处理)。
- 示例:编译器(词法分析 → 语法分析 → 语义分析)。
- 批处理风格
重点考点
- 适用场景:
- 批处理:数据完整性要求高、无需实时处理的场景(如月度结算)。
- 管道-过滤器:数据流连续、需分步处理的场景(如音视频转码)。
- 缺点:数据格式强耦合、不适合交互式系统。
典型考题
Q: 管道-过滤器风格中,若需修改数据处理逻辑,应调整哪个部分?
A: 修改或替换特定过滤器,保持管道接口一致即可。
三、调用/返回体系结构风格
核心概念
-
核心思想
- 分而治之:将系统分解为子系统,通过调用-返回机制降低复杂度。
-
子风格分类
风格类型 构件 连接件 特点 主程序/子程序 主程序、子程序 过程调用 单线程控制,层次化调用(子程序正确性依赖下层正确性)。 面向对象 对象 方法调用/消息传递 封装数据与操作,通过接口交互(如Java类实例化)。 层次型 层次(虚拟机) 层间协议 每层为上层服务,下层透明(如OSI网络模型)。 客户端/服务器 客户端、服务器 网络协议 资源不对等,分两层(胖客户端)或三层(瘦客户端+应用服务器+数据库)。
重点考点
- C/S架构演进:
- 两层C/S:客户端处理业务逻辑,易导致“胖客户端”问题。
- 三层C/S:表示层(UI)、业务逻辑层(应用服务器)、数据层(DB),解耦业务与数据。
- 层次型架构关键约束:层间仅通过接口交互,增强可维护性与重用性。
典型考题
Q: 三层C/S架构中,为何称客户端为“瘦客户机”?
A: 业务逻辑移至应用服务器,客户端仅负责表示层(UI),功能简化。
四、 以数据为中心的体系结构风格
核心概念
-
仓库风格
- 构件:中央数据结构 + 独立操作构件。
- 交互:构件通过查询/修改中央数据交互(如数据库管理系统)。
-
黑板风格
- 适用场景:解决非结构化复杂问题(如语音识别、专家系统)。
- 核心组件:
- 知识源:独立领域知识模块。
- 黑板:分级组织的共享数据(部分解空间)。
- 控制机制:事件驱动,动态调度知识源。
重点考点
- 仓库 vs. 黑板:
- 仓库:数据被动响应操作(传统数据库)。
- 黑板:数据状态主动触发知识源(动态问题求解)。
- 黑板系统优势:支持多知识源协作,适应不确定性高的场景。
典型考题
Q: 黑板风格如何支持语音识别任务?
A: 声音信号作为黑板数据,知识源(如特征提取、模式匹配)逐步生成识别结果。
五、虚拟机体系结构风格
核心概念
-
核心思想
- 构建自定义运行环境,解析执行特定语言(如脚本引擎、规则引擎)。
-
子风格分类
- 解释器风格
- 组件:解释引擎、代码存储区、状态跟踪数据结构。
- 应用:仿真硬件/关键应用(如Java虚拟机),牺牲效率换灵活性。
- 规则系统风格
- 组件:规则集、规则解释器、工作内存。
- 应用:业务规则频繁变化的系统(如风控引擎)。
- 解释器风格
重点考点
- 优缺点:
- 优:灵活支持动态行为(如规则热更新)。
- 缺:执行效率低于编译型系统。
- 典型应用:专家系统、DSL(领域特定语言)执行环境。
典型考题
Q: 解释器风格为何执行效率较低?
A: 需实时解析指令并模拟运行环境,无法像编译型语言直接执行机器码。
六、独立构件体系结构风格
核心概念
-
核心思想
- 构件独立运行,通过隐式通信降低耦合度。
-
子风格分类
- 进程通信风格
- 构件:独立进程;连接件:消息传递(RPC、消息队列)。
- 事件系统风格
- 原理:构件触发事件 → 系统自动调用注册过程(隐式调用)。
- 特点:事件触发者无需知晓受影响构件(如IDE调试器断点事件)。
- 进程通信风格
重点考点
- 事件系统优势:支持松耦合集成(如工具插件化),增强扩展性。
- 隐式调用挑战:行为不确定性(执行顺序不可预测),需结合显式调用补充。
典型考题
Q: 事件系统中,如何保证多个构件的响应顺序?
A: 无法保证,需通过优先级机制或显式依赖管理(如消息队列顺序消费)。
章节总结对比表
架构风格 | 核心构件 | 连接机制 | 典型应用场景 | 关键优势 |
---|---|---|---|---|
数据流 | 过滤器/处理步骤 | 数据流管道 | 编译器、ETL工具 | 分步处理、高内聚 |
调用/返回 | 程序/对象/层次 | 过程调用/方法调用 | 企业应用、分层系统 | 结构清晰、易扩展 |
以数据为中心 | 中央数据+操作构件 | 数据访问/事件触发 | 数据库、复杂决策系统 | 数据统一管理、支持协作 |
虚拟机 | 解释引擎/规则集 | 指令解析/规则匹配 | DSL执行器、专家系统 | 灵活性高、支持动态行为 |
独立构件 | 进程/事件监听器 | 消息传递/事件广播 | 插件系统、分布式服务 | 低耦合、易集成新功能 |
典型考题解析
-
概念辨析题
Q: 主程序/子程序风格与面向对象风格的核心区别是什么?
A: 前者基于过程分解(函数调用层次),后者基于数据抽象(对象封装状态与行为)。 -
场景应用题
Q: 某电商系统需支持高并发订单处理与实时风控,应选择哪种混合架构?
A:- 调用/返回(三层C/S):分离表示层、业务层、数据层。
- 事件系统:异步处理订单流水(如库存扣减、支付通知)。
- 规则系统:实时风控(动态规则匹配)。