软件体系结构是具有一定形式的结构化元素的集合(构件的集合)。构件分为三类包括处理构件(对数据进行加工)、数据构件(被加工的信息)和连接构件(连接体系结构的不同部分)。当然也可以说是由构件、连接件和约束条件组成。

软件架构风格是指描述某一特定应用领域中系统的组织方式的惯用模式。反应了领域中众多系统所共有的结构和语义特性,并指导如何将各个构件有效的组织成一个完整的系统。

主要存在5种架构风格:分别为:

5种常见架构风格和具体子类
架构风格包含
数据流风格批处理序列、管道/过滤器
调用/返回风格面向对象风格、主程序/子程序、层次结构
独立构件风格进程通信;事件驱动系统(隐式调用)
虚拟机风格解释器、基于规则的系统
以数据为中心超文本系统、黑板系统


一、数据流风格

数据流风格的软件架构是一种最常见,结构最为简单的软件架构。这样的架构下,所有的数据按照流的形式在执行过程中前进,不存在结构的反复和重构,就像工厂中的汽车流水线一样,数据就像汽车零部件一样在流水线的各个节点上被加工,最终输出所需要的结果(一部完整的汽车)。在流动过程中,数据经过序列间的数据处理组件进行处理,然后将处理结果向后传送,最后进行输出。

1、批处理序列

1)构件为一系列固定的顺序的计算单元,构件之间只通过完整的数据传递交互;

2)每个处理步骤都是一个独立的程序,每一步必须在前一步结束后才能开始;

3)数据必须是完整的,以完整的方式传递

优点:

  • 高效性:批处理架构可以处理大量的数据和任务,通过批量处理可以减少系统开销和资源消耗,提高处理效率。
  • 可扩展性:批处理架构可以轻松地扩展到处理更多的数据和任务,适应不断增长的需求。
  • 可靠性:批处理架构通常具有错误处理和容错机制,可以处理异常情况并保证数据的完整性和一致性。
  • 自动化:批处理架构可以自动执行,减少人工干预和操作的需求,提高工作效率。

缺点:

  • 延迟性:由于批处理需要等待一定的数量的任务或数据累计后才能执行,因此可能会导致一定的延迟,不适用于实时性要求较高的场景。
  • 复杂性:批处理机构通常涉及到大量的数据处理和任务调度,需要设计和实现复杂的逻辑和流程,增加了系统的复杂性和维护成本。
  • 可见性:由于批处理是一次性处理数据或任务,因此在处理过程中可能无法实时查看和监控处理的进度和状态。
  • 难以调试:由于批处理通常是一次性执行的,当出现错误或者异常时,调试和定位问题可能会比较困难,需要依赖日志和错误报告来进行排查。

2、管道/过滤器风格

管道/过滤器风格是将数据或者事件通过一系列的过滤器处理和转换的设计模式,它把系统分成连续的处理步骤,这些步骤通过数据流进行连接,上一个步骤的输出就是下一个步骤的输入。这里的构件主要是过滤器和管道。相较于批处理风格,它处理的数据不是完整的数据,而是流数据

优点:

  • 关注点分离:每个过滤器只关注特定的任务或者功能,使得系统的处理逻辑清晰和模块化。不同的过滤器可以独立开发、测试和维护,提高了代码的可读性和可维护性
  • 可复用:每个过滤器都是独立的单元,可以在不同的上下文中进行复用,可以减少代码冗余,提高代码开发效率
  • 支持并发:每个过滤器独立运行,不同子任务可以并行执行
  • 灵活性:通过组合不同的过滤器,可以灵活处理流程和功能组合。可以根据需求动态调整过滤器的顺序或者添加删除过滤器,以满足不同的业务需求

缺点:

  • 不适合用来设计交互式应用系统
  • 复杂性增加
  • 性能开销大:经过多个过滤器,每个过滤器都需要进行数据处理,会造成性能损耗
  • 难以调试和测试:由于经过多个过滤器,调试和测试将会变得比较困难

管道/过滤器更适合连续的数据流或者事件流,并且每次过滤器的处理都是相对独立的情况。对于存在复杂的依赖关系或者需要全局状态共享的系统,该风格会变得复杂和难以维护

二、调用/返回风格

调用返回风格顾名思义,就是指在系统中采用了调用与返回机制。利用调用/返回实际上是一种分而治之的策略,其主要思想是将一个复杂的大系统分解为一些子系统,以便降低复杂度,并且增加可修改性。程序从其执行起点开始执行该构件的代码,程序执行结束,将控制返回给程序调用构件。

1、面向对象风格

1)构件是对象,对象是抽象数据类型的实例,系统被看做是对象的集合,每个对象都有一个它自己的功能集合。

2)连接件是对象间的交互方式,对象之间通过函数调用和消息传递实现交互。

优点:

  • 易维护:才用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,维护也只需要在局部模块,成本交底
  • 高质量:在设计时,可以重用现有、以前项目已经测试过的类是系统满足业务需求,并且具有较高的质量
  • 实现封装:在软件开发时,根据设计的需要对现实世界的实物进行抽象,封装产生类的属性和方法
  • 易扩展:由于继承、封装、多态的特性,自然设计出高内聚,低耦合的系统结构,使得系统更灵活、更容易扩展,成本较低

缺点:

  • 增加了对象之间的依赖关系
  • 过度抽象:有时设计的类过于抽象,不仅增加编程的难度,也使得程序的运行效率降低

2、主程序/子程序风格

即为面向过程的风格,其中主程序负责控制整改程序的流程和逻辑,而子程序则负责执行特定的任务和功能。

优点:

  • 结构清晰:主程序和子程序之间的分离使得代码更容易理解和维护
  • 代码重用:子程序可以在不同的地方被调用,提高了代码的重用性
  • 控制能力强:主要表现在主程序对子程序有强大的控制力,可以有效的管理并协调各个子程序只记得关系和执行顺序

缺点:

  • 不易扩展:当系统规模扩大时,管理和维护各个子程序之间的调用关系会变得更加困难,同时会增加系统的复杂性
  • 程序的流程控制集中在主程序中,可能导致主程序变得庞大而复杂
  • 子程序之间的依赖关系可能导致代码的耦合性增加,一处的修改可能会影响其他地方的修改

总之,主程序/子程序架构风格在一些简单的应用场景中是有效的,但是在复杂的应用中会导致代码的可维护性和可扩展性下降

3、层次结构

1)构件组成一个层次结构,连接件通过决定层间如何交互的协议来定义;

2)每一层为上层提供服务,使用下一层的服务,只能见到自己临接的层;

3)各个层次的组件形成不同功能级别的虚拟机,多层相互协同工作,而且实现透明;

优点:

  • 通过层次结构,可以将大的问题分解为若干个渐进的小问题逐步解决,可以隐藏问题的复杂度
  • 支持系统设计过程中的逐级抽象,每一层的抽象级别不同,底层抽象级别高,顶层抽象级别低
  • 松耦合:每一层只能影响相邻的两层,允许每层使用不同的方法实现层的功能,支持复用
  • 可扩展性好

缺点:

  • 不能适用所有系统,不同层之间耦合度高的系统很难实现
  • 正确层次划分困难
  • 性能不佳:由于数据不能跨层传输,造成性能下降

三、独立构件风格

独立构件风格主要强调系统中的每个构件都是相对独立的个体,它们之间不直接通信,以降低耦合度,提升灵活性。

1、进程通信

构件是独立的进程,连接件事消息的传递。构件通常是命名的过程,消息传递的方式可以是点对点、异步或同步方式,以及远程调用等。

优点:

  • 支持分散式计算
  • 健壮性:对任何给定节点的故障处理具有强大的健壮性
  • 可扩展性:在资源和计算能力方面具有很高的可扩展性

缺点:

  • 服务质量没有保证,因为节点是自愿合作的
  • 安全是很难得到保证的
  • 性能取决于节点的数量

2、事件驱动

是一种基于发布/订阅模式的消息异步通信的架构,构件不直接调用过程,而是声明事件。系统其他构件的过程可以在这些事件中进行注册。当事件被触发时,系统自动调用这个事件在注册的所有过程。因此,触发一个事件会引起其他构件的过程调用。可以用来设计规模很大的应用程序。

优点:

  • 容易实现并发处理和多任务
  • 松耦合
  • 易扩展
  • 易维护,能够简化代码
  • 适合描写系统组

缺点:

  • 构件放弃了对系统计算的控制,当一个构件发布一个事件时,并不能确定另一个构件会响应,而且不能保证构件被调用的顺序
  • 各个对象的逻辑关系复杂

四、虚拟机风格

虚拟机风格的基本思想是人为构建一个运行环境,在这个环境之上,可以解析与运行自定义的一些语言,这样来增加架构的灵活性,适合特定的领域。

1、解释器风格

解释器是解释自定义的规则,通常包括一个完整的解释工作的解释引擎、一个包含被解释的代码的存储区、一个记录当前工作状态的数据结构,以及一个记录源代码被解释执行的进度的数据结构。适用于使用模式匹配系统与语言编辑器。

优点:

  • 提供程序的跨平台的移植能力
  • 具有解释器风格的软件中一般包含一个虚拟机,可以仿真硬件的执行过程和一些关键的应用,灵活应对自定义场景

缺点:

  • 由于使用了特定的语言和自定义的操作规则,因此增加了系统的运行开销,执行效率低
  • 只适合特定的领域

2、基于规则的系统:

基于规则的系统包括规则集、规则解释器、规则/数据选择器和工作内存,一般用在人工智能领域和DSS中。

优点:

  • 容易被人类理解
  • 容易修改和扩展

缺点:

  • 不灵活,不能适应不断变化的条件
  • 执行速度慢,因为做出决定之前需要检查所有的规则

五、以数据为中心

在这种风格中,有两种不同类型的软件元素:一种是中央数据单元,也成为资源库,用于表示系统的当前状态;另一种是相互依赖的构件组,这些构件可以对中央数据单元实施操作。中央数据单元和构件之间可以进行信息交换,这是数据共享体系结构的技术实现基础

1、超文本系统

构件以网状链接方式相互连接,用户可以在构件之间进行按照人类的联想思维方式任意跳转到相关的构件。超文本是一种非线性的网状信息组织方法,它一节点为基本单位,链作为节点之间的联想式关联。超文本系统通常应用在互联网领域,现代集成编译环境一般才有这种架构风格

2、黑板系统

包括知识源、黑板(中央数据单元)和控制单元三部分。知识源包括若干独立计算的不同单元,提供解决问题的知识。知识源响应黑板的变化,也只修改黑板;黑板是一个全局数据库,包含问题域解空间的全部状态,是知识源相互作用的唯一媒介;知识源的响应是通过黑板状态的变化来控制的。黑板是数据共享体系结构的一个特例,用以解决状态冲突并处理可能存在的不确定性知识源。黑板常用于信号处理,如语音和模式识别,同时在自然语言处理领域中也有广泛的应用,如机器翻译和句法分析

优点:

  • 便于多客户共享大量数据,而不必关心数据是何时产生的、由谁提供的及通过何种途径来提供
  • 便于将构件作为知识源添加到系统中来

缺点:

  • 对共享数据结构,不同知识源要达成一致
  • 需要同步机制和加锁机制来保证数据的完整性和一致性,增大了系统设计的复杂度

以下是总结的软考常考的架构的情况