4.软件架构风格(重要)
每年综合知识(选择)都会考几分
概念
架构风格定义了用于描述系统的术语表和一组指导构建系统的规则
架构风格反映领域中众多系统共有的结构和语义特征
架构定义过程中需要把共性定义出来。比如建筑风格(中式、日式、美式)
五大架构风格
数据流风格【Data Flow】

把数据的处理分步骤进行
前一步的处理结果是后一步的输入内容【数据驱动】
- 优点
- 松耦合【高内聚-低耦合】
- 良好的重用性/可维护性
- 可拓展性
- 良好的隐蔽性
- 支持并行
- 缺点
- 交互性较差
- 复杂性较高
- 性能较差(每个过滤器都需要解析和合成数据)
- 典型实例
- 传统编译器(C 语言)
- 网络报文处理
批处理
大量整体数据(成批导入),无需用户交互
管道-过滤器
特点
过滤器相对独立
优点
功能模块可复用(因为独立)、可维护性和可拓展性比较强;具有并发性;模块独立性高。
缺点
不适用于交互性强的应用,对于存在关系的数据流必须进行协调
适合领域
系统可划分清晰的模块;模块相对独立;有清晰的模块接口
调用/返回风格【Call/Return】

系统开发过程中用得最多的风格,
流程:主函数调用子函数,子函数计算结果后返回
主程序/子程序
面向过程
面向对象
特点
力争实现问题空间和软件系统空间结构的一致性
优点
高度模块性;实现封装;代码共享灵活;易维护;可扩充性好
缺点
增加了对象之间的依赖关系
分层架构(相对重要)
层与层之间的方法调用
例如 ISO 七层模型
- 优点
- 良好的重用性,只要接口不变可用在其他处
- 可维护性好
- 可扩展性好,支持递增设计
- 缺点
- 并不是每个系统都方便分层
- 很难找到一个合适的、正确的层次抽象方法
- 不同层次之间耦合度高的系统很难实现
- 特点
- 各个层次的组件形成不同功能级别的虚拟机
- 多层相互协同工作,而且实现透明
独立构件风格【Independent Components】

类似于 onClick 事件
- 优点
- 松耦合
- 良好的重用性/可修改性/可拓展性
- 缺点
- 构件放弃了对系统计算的控制。一个构件触发一个事件时,不能确定其他构件是否会响应它。而且即使它知道事件注册了哪些构件的过程,它也不能保证这些过程被调用的顺序
- 数据交换的问题
- 既然过程的语义必须依赖于被触发事件的上下文约束,关于正确性的推理就存在问题
- 特点
- 系统由若干子系统构成且成为一个整体
- 系统有统一的目标
- 系统有主从之分
- 每一个子系统有自己的事件收集和处理机制

进程通信体系结构风格
基于事件的隐式调用风格
组件(或模块)不直接调用其他组件提供的特定服务,而是通过发布(发出)事件来广播自身状态的改变或发生的特定情况。其他对这些事件感兴趣的组件则订阅(监听)这些事件,并在事件发生时自动执行相应的处理逻辑。
可以将其想象成广播电台和听众。电台(事件发布者)播放节目(发布事件),它不知道有哪些听众(事件订阅者)在收听,也不知道听众会如何反应。听众(事件订阅者)根据自己的兴趣选择收听特定的节目(订阅特定的事件),并在节目播放时做出相应的反应(执行事件处理逻辑)。
特点
系统由若干子系统构成且成为一个整体;系统有统一的目标;子系统有主从之分;每一个子系统有自己的事件收集和处理机制
优点
适合描写系统组;容易实现并发处理和多任务;可扩展性好;具有类层次结构;简化代码;
缺点
因为树型结构所以削弱了对系统计算的控制能力;各个对象的逻辑关系复杂;
适合领域
一个系统对外部的表现可以从它对事件的处理表征出来
虚拟机风格【Virtual Machine】

Java 因为引入了虚拟机使得 Java 程序可以跨平台运行
解释器

解释器引擎解释的是自定义的要被解释的代码
特点
系统核心是虚拟机
优点
- 可以用多种操作来解释一个句子,灵活应对自定义场景
缺点
- 适合特定领域
适合领域
- 适用于需要“自定义规则”的场合
- 适合于模式匹配系统与语言编译器
以规则为中心
加强版解释器

特点
- 在解释器的基础上增加经验规则
适合领域
- 适用于专家系统
两种子风格都可以灵活应对自定义场景,缺点都是复杂度较高
以数据为中心(仓库风格、数据共享风格)【Data-centered】
有两种构件:中央数据结构说明当前数据的状态以及一组对中央数据进行操作的独立构件
数据库系统
- 特点
- 以数据为中心
黑板系统:语音识别、知识推理

可以用数据库系统实现 只是增加了触发机制。
- 优点
- 可更改性和可维护性
- 可重用性的知识源
- 容错性和健壮性
- 缺点
- 测试困难
- 不能保证有好的解决方案
- 难以建立好的控制策略
- 低效
- 开发困难
- 缺少并行机制
- 特点
- 在以数据为中心的基础上,使用中心数据触发业务逻辑部件
- 典型实例
- 语音识别
- 模式识别
- 图像处理
- 知识推理
超文本系统
闭环控制风格(过程控制)
一般在嵌入式系统里应用的比较多,不适合复杂场景

开环控制:看电视 -> 遥控器发出指令 -> 电视接收指令(数据发出以后,数据没有回来)
闭环控制:夏天炎热 -> 开空调 -> 调 18 度 -> 空调控制压缩机全力制冷 -> 通过 10 分钟极速降温 -> 对比是否到达 18 度 -> 到达则停止(会跟进数据是否有到达预期)
特点
通过不断的测量被控对象,认识和掌握被控对象;将控制理论引入体系结构构建。
优点
将控制理论引入到计算机软件体系结构中
缺点
适合特定领域
适合领域
该系统中一定存在有目标的作用、信息处理闭环控制过程
C2 架构风格
是层次架构风格的一种,是一种并行构建网络,通过连接件按照一组规则绑定在一起

软件架构评估

-:表示负相关,例如性能提升安全性则下降
+:表示正相关,例如可维护性提升则可用性提升
MDA(理想化状态下的产物)
Model Driven Architecture(模型驱动架构)
使用模型完成软件的分析、设计、构件、部署、维护等各开发活动
主要目标
- 可移植性
- 互通性
- 可重用性
核心模型
- 计算无关 CIM:对某具体行业内一个项目的业务需求及其系统功能需求进行分析
- 平台独立 PIM:具有高抽象层次、独立于任何实现技术的模型
- 平台相关 PSM:为某种特定实现技术量身定做,让你用这种技术中可用的实现构造来描述系统的模型。PIM 会被变换成一个或多个 PSM
- 代码 Code:用源代码对系统的描述。每个 PSM 都将被变换成代码。