软件架构风格是 描述某一特定应用领域中系统组织的惯用方式。架构风格定义一个系统家族,即 一个架构的定义、一个词汇表和一组约束。词汇表中包含一些构件和连接件类型,而这组约束指系统将如何将这些构件和连接件组合起来的。
架构风格反映了领域中的结构和语义特征,并指导如何将各个模块和子系统有效的组织成一个完整的系统。
架构设计的核心问题,架构级的软件复用。
架构风格定义了用于描述系统的术语表和一组指导构件系统的规则。
- 数据流风格:面向数据流,按照一定顺序从前往后执行程序,代表的风格有批处理序列、管道-过滤器。
- 调用/返回风格:构件之间互相调用,一般显示调用。代表风格有 主程序/子程序、面向对象、层次结构。
- 独立构件风格:构件之间互相独立,不存在显示调用,而是通过某个事件触发、异步调用。代表风格有 进程驱动、事件驱动系统(隐式调用)。
- 虚拟机风格:自定义一套规则给使用者使用,使用者基于这个规则开发构件,适配平台。代表风格有 解释器、基于规则的系统。
- 仓库风格:以数据为中心,所有的操作都是围绕建立的数据中心进行,代表有 数据库系统、超文本系统和黑板系统。
数据流风格
批处理序列:构件之间只能通过数据交互,每个步骤是个独立的程序,每一步必须在其前一步结束才能开始,数据必须是整体、完整的方式传递。
管道-过滤器:每一个构件都有输入和输出,数据通过构件内部处理,上一个构件的输出就是下一个构件的输入。管道是连接件,过滤器是构件。
(批处理必须是前一步的结束才能开始下一步,管道-过滤器则不需要等待,所以管道-过滤器适合流媒体,一边下载电影一边播放电影,边看边播)
调用/返回风格
主程序/子程序:单线程控制。把问题划分为若干个处理步骤,构件即为主程序和子程序,子程序通常可合成模块。过程调用作为交互机制,充当连接件角色。
面相对象:构件是对象,对象是抽象数据类型的实例。连接件即是对象交互的方式,对象通过函数和过程的调用来交互。
层次结构:构件组成层次结构,连接件通过决定层间的如何交互协议来定义。修改某一层,最多只能影响上下相邻的两层(好的设计只会影响上层)。
层次的优点:
- 扩展性更好,可以根据不同的层级开发扩展,将复杂的问题分解成增量步骤。
- 越靠底层,抽象级别越高。
- 层级的调用增加了复用性。
缺点:
1抽象分层不是那么容易。
2性能降低。
独立构件风格
进程通信:构件是独立的进程,连接件是消息传递。消息传递的方式通常可以是 点对点、异步或同步方式,以及远程过程(方法)调用等。
事件驱动系统(隐式调用):不是直接调用一个过程,而是触发或广播一个或多个事件。构件中的过程在一个或多个事件中注册,当某个事件被触发时,系统自动调用在这个事件中注册的所有过程。一个事件的触发导致另一个模块调用过程。
优点:为了软件复用提供了强力支持,为构件的维护和演化带来了方便。
缺点:构件放弃了对系统计算的控制。
虚拟机风格
解释器:包含 一个完成解释工作的解释引擎、一个包含将被解释的代码的存储区、一个记录解释引擎当前工作状态的数据结构,以及 一个记录源代码被解释执行的进度的数据结构。具有解释器风格的软件中含有一个虚拟机(java虚拟机),可以仿真硬件执行过程和一些关键应用,缺点是执行效率低。
基于规则的系统:包括 规则集、规则解释器、规则/数据选择器和工作内存,一般用在人工智能领域和DSS中。
仓库风格
数据库系统:构件主要两大类,一类是中央共享数据源,保存当前系统数据状态;另一类是多个独立处理单元,处理单元对数据元素进行操作。
黑板系统:包括知识源、黑板和控制三部分。知识源包括若干独立计算的不同单元,提供解决问题的知识。知识源响应黑板的变化,也只修改黑板。黑板是一个全局数据库。知识源通过黑板状态的变化来控制的。黑板系统通常应用在对于解决问题没有确定性算法的软件中。
超文本系统:构件以网状链接方式相互连接,用户可以在构件之间进行按照人类的联想思维方式任意跳转到相关构件。通常应用在互联网领域。
现代编译器的集成开发环境一般采用数据仓库风格进行开发,其中心数据就是程序的语法树。
注意
语法高亮显示,语法错误提示(比如idea里提示语法错误) 都是属于 事件驱动(隐式调用)。
虚拟机的解释器:自定义流程,灵活定义规则。
虚拟机的规则:机器人。(DSS、人工智能和专家系统)
其他风格
闭环控制
当软件用来操作一个物理系统时,软件与硬件之间可以粗略的表示为一个反馈循环。(比如空调、汽车巡航)
C2体系风格
通过连接件绑定在一起,构件不能相互连接,连接件的顶部和连接件的底部链接起来。