软件架构风格
概念与定义
- 软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。
- 架构风格定义了一个系统家族,即一个架构定义、一个词汇表和一组约束。词汇表中包含一些构件和连接件类型,而约束指出系统是如何将这些构件和连接件组合起来的。
作用与意义
- 架构风格反映了领域中各系统所共有的结构和语义特性,并指导如何将各模块和子系统有效地组织成一个完整的系统。
- 对软件架构风格的研究和实践促进了设计的重用,一些经过实践验证的解决方案也可以可靠地用于解决新的问题。
- 架构设计的一个核心问题是能否达到架构级的软件复用。
规则与规范
- 架构风格定义了用于描述系统的术语表和一组指导构建系统的规则。
常见架构风格类型
数据流风格
面向数据流,按照一定的顺序从前向后执行程序。代表风格有批处理序列、管道-过滤器。
批处理序列
- 构件为一系列固定顺序的计算单元,构件之间只通过数据传递交互。
- 每个处理步骤是一个独立的程序,每一步必须在其前一步结束后才能开始。
- 数据必须是完整的,以整体方式传递。
管道-过滤器
- 每个构件都有一组输入和输出,前一个构件的输出作为后一个构件的输入。
- 构件读取输入的数据流,经过内部处理,产生输出数据流。
- 过滤器就是构件,连接件就是管道。
一般用在流媒体中,边看边播。
调用/返回风格
- 构件之间存在互相调用的关系,一般是显式调用。
- 代表风格:主程序/子程序、面向对象、层次结构
调用/返回风格强调构件之间通过调用关系进行交互,常见于主程序/子程序、面向对象、层次结构等系统。
主程序/子程序
- 单线程控制,把问题划分为若干处理步骤,构件即为主程序和子程序。
- 子程序通常可合成为模块,过程调用作为交互机制,充当连接件的角色。
面向对象
- 构件是对象,对象是抽象数据类型的实例。
- 连接件即对象间交互的方式,对象通过函数和过程的调用来交互。
层次结构
- 构件组成一个层次结构,连接件通过协议定义层间如何交互。
- 每层为上一层提供服务,只能见到与自己邻接的层。
- 修改某一层,最多影响其相邻的两层(通常只影响上层)。
层次结构优点
- 支持基于可增加抽象层的设计,便于复杂问题分解和增量步骤实现。
- 不同层次处于不同抽象级别,越靠近底层抽象级别越高。
- 每层只需与相邻层提供相同接口,允许每层用不同方法实现,便于软件复用。
层次结构缺点
- 并不是每个系统都能容易划分为分层模式。
- 很难找到一个合适、正确的分层方法。
记忆要点:
- 主程序/子程序=过程调用、分模块
- 面向对象=对象实例、函数/过程调用
- 层次结构=分层、协议、只影响相邻层、便于复用
独立构件风格
独立构件风格强调构件之间相互独立,不存在显式调用关系。构件通过事件触发和异步通信的方式进行交互。代表风格包括进程通信和事件驱动系统。
进程通信
- 构件是独立的进程,连接件是消息传递。
- 构件通常是命名过程,消息传递方式可以是点对点、异步或同步方式,以及远程过程(方法)调用等。
事件驱动系统(隐式调用)
- 构件不直接调用一个过程,而是触发或广播一个或多个事件。
- 构件中的过程在一个或多个事件中注册,当某个事件被触发时,系统自动调用在该事件中注册的所有过程。
- 一个事件的触发可导致另一个模块中的过程调用,这种风格的构件是匿名过程,连接件往往是通过过程之间的隐式调用来实现的。
优缺点
- 主要优点:为软件复用提供了强大支持,为构件的维护和演化带来方便。
- 缺点:构件放弃了对系统计算的控制。
记忆要点:
- 进程通信=独立进程、消息传递、点对点/异步/同步/远程调用
- 事件驱动=触发事件、隐式调用、自动注册、匿名过程
- 优点:强复用、易维护
- 缺点:失控
虚拟机风格
虚拟机风格通过自定义一套规则供使用者使用,开发者可以基于这些规则来开发构件。这种风格的一个重要特点是能够实现跨平台适配。其代表性的架构风格包括解释器和基于规则的系统。
解释器
- 主要组成部分:
- 解释引擎:完成解释工作的核心组件
- 代码存储器:存储待解释的代码
- 状态数据结构:记录解释引擎当前工作状态
- 执行进度结构:记录源代码的解释执行进度
优点
- 可以仿真硬件执行过程和关键应用
- 实现跨平台运行
- 便于调试和修改
缺点
- 执行效率较低,相比直接编译执行
- 需要额外的解释开销
基于规则的系统
基于规则的系统主要包含以下组成部分:
- 规则集:存储系统所有规则的集合
- 规则解释器:负责解释和执行规则的引擎
- 规则/数据选择器:选择当前要执行的规则和数据
- 工作内存:存储系统运行时的数据
这种架构风格主要应用于人工智能领域和决策支持系统(DSS)。
记忆要点:
- 解释器=解释引擎+代码存储+状态数据+执行进度
- 优点:跨平台、易调试、可仿真
- 缺点:效率低、额外开销
- 规则系统=规则集+解释器+选择器+工作内存
仓库(数据共享)风格
以数据为中心,所有的操作都围绕统一的数据中心进行。 仓库风格主要包含以下几种类型:
数据库系统
构件主要有两大类:
- 一类是中央共享数据源,保存当前系统的数据状态
- 另一类是多个独立处理单元,处理单元对数据元素进行操作。
黑板系统
- 包括知识源、黑板和控制三部分
- 知识源包括若干独立计算的不同单元,提供解决问题的知识,知识源响应黑板的变化,也只修改黑板
- 黑板是一个全局数据库,包含问题域解空间的全部状态,是知识源相互作用的唯一媒介
- 知识源响应是通过黑板状态的变化来控制的。
- 黑板系统通常应用在对于解决问题没有确定性算法的软件中(信号处理、问题规划和编译器优化等)。
超文本系统
- 软件以网状链接方式组织链接
- 用户可以在构件之间进行按照人类的联想思维方式任意跳转到相关构件。
- 是一种非线性的网状信息组织方法,以文本节点为基本单位,链接为节点之间的联想式关系的网状风格
- 通常应用在互联网领域