常见软件架构风格介绍

简述

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

架构风格定义了用于描述系统的语义表和一组指导构建系统的规则。

四要素:
1.提供一个词汇表
2. 定义一套配置规则
3. 定义一套语义解释原则
4. 定义对基于这种风格的系统所进行的分析

最终目的: 达到架构级的软件复用

1. 数据流风格

整体风格: 以处理数据为导向,数据按流的形式在执行过程中不断前进,不存在结构的反复和重构。

1.1 批处理

特点:

  1. 每一步处理都是独立的,而且每一步都是顺序执行的。
  2. 数据传送在步与步之间作为一个完整的整体。

典型应用: 经典数据处理、windows下的BAT程序

1.2 管道-过滤器

在这里插入图片描述

特点:

  1. 每个构件(过滤器)都有一组输入和输出,构件读输入数据,经过内部处理,产生输出数据。
  2. 过滤器必须是独立的实体,不能与其他过滤器共享数据,一个过滤器不知道上下游的标识,管道-过滤器网络的输出正确性不依赖于过滤器进行增量计算过程的顺序。

优点:

  1. 良好的隐蔽性、高内聚、低耦合。
  2. 允许设计者将整个系统的输入输出行为看成是多个过滤器行为的简单合成。
  3. 支持软件重用。
  4. 系统维护和增强系统性能简单。
  5. 支持并行操作。

缺点:

  1. 通常导致进程成为批处理的结构,必须将每个过滤器看成是一个完整的输入到输出的转换。
  2. 不适合处理交互的应用,当需要增量地显示改变时,问题尤为严重。
  3. 因为在数据的传输上没有通用标准,每个过滤器都增加了解析和合成数据的工作。

典型应用: 传统编译器、unix shell编写的程序


2. 调用返回风格

整体风格: 分而治之,将一个复杂的大系统分解为一些子系统,以便降低复杂度、增加可修改性。

2.1 主程序-子程序

特点:

  1. 一般为单线程控制,将问题划分为若干处理步骤,构件为主程序和子程序。
  2. 过程调用作为交互机制,即充当连接件。
  3. 调用关系具有层次性,语义逻辑表现为子程序的正确性,取决于它调用的子程序的正确性。

典型应用: 结构化开发时期的经典架构风格

2.2 面向对象

在这里插入图片描述
特点:

  1. 建立在数据抽象和面向对象的基础上,数据的表示方法和它们相应的操作封装在一个抽象数据类型或者对象中。
  2. 构件是对象,或者说抽象数据类型的实例。
  3. 对象是一种被成为管理者的构件,负责保持资源的完整性,对象通过函数和过程的调用来交互。

优点:

  1. 对象的表示对其他对象是隐藏的,因此这些对象可以不影响他的客户就能改变其实现方法。
  2. 设计者可以将数据存取操作分解成一些交互的代理程序的集合。

缺点:

  1. 为了使一个对象和另一个对象通过过程调用等交互,必须知道对象的标识。
  2. 必须修改所有显式调用它的其他对象,并消除由此带来的副作用(A使用B,C使用B,C对B的使用可能对A有影响)。

2.3 层次结构

在这里插入图片描述
特点:

  1. 层次系统组织成一个层次结构,每层为上层的服务,为下层的客户。
  2. 除了一些精心挑选的输出函数外,内部的层只对相邻的层可见。
  3. 连接件通过决定层间如何交互的协议来定义
  4. 拓扑约束包括对相邻层间交互的约束

优点:

  1. 支持基于抽象程度递增的系统设计,可以把一个复杂系统按递增的步骤分解。
  2. 支持功能增强,因为一层最多和相邻上下两层交互,因此功能的改变最多影响相邻的上下层。
  3. 支持重用,只要提供的服务接口定义不变,同一层的不同实现可以交换使用。

缺点:

  1. 并不是每个系统都可以容易地划分为分层模式。
  2. 很难找到一个合适、正确的层次抽象方法。

3. 独立构件风格

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

3.1 进程通信

特点:

  1. 构件是独立的进程,连接件是消息传递。
  2. 构件通常是命名过程,消息传递的方式可以是点到点,异步同步、远程过程调用。

3.2 事件驱动(隐式调用)

特点:

  1. 构件是一些模块,这些模块既可以是一些过程,可以是事件的集合
  2. 构件中的过程在一个或多个事件中注册(回调)。
  3. 不直接调用一个过程,而是出发或广播一个或多个事件。
  4. 事件的触发者并不知道哪些构件会被这些事件影响
  5. 不能假定构件的处理顺序、甚至不知道哪些过程被调用

优点:

  1. 为软件重用提供了强大支持,需要一个构件加入现存系统中,只需要将它注册到系统的事件中。
  2. 为改进系统带来 了方便,当一个构件替换另一个构件时,不会影响到其他构件的接口。

缺点:

  1. 构件放弃了对系统计算的控制:
    构件触发一个事件是,不能确定构件是否会相应他。
    知道事件注册了哪些构件的过程,也不能保证这些过程的调用顺序
  2. 数据交换问题:有时基于事件的系统必须依靠一个共享的仓库进行交互,全局性能和资源管理就成了问题
  3. 过程的语义必须依赖被触发的事件的上下文约束,关于正确的推理存在问题

典型应用: 编程环境中工具:debug断点


4. 虚拟机风格

整体风格: 人为构建一个运行环境,这个环境之上,可以解析与运行自定义的一些语言,以增加架构的灵活性。

4.1 解释器

组成:

  1. 完成解释工作的解释引擎
  2. 包含将被解释的代码存储区
  3. 记录解释引擎当前工作状态的数据结构
  4. 记录源代码被解释执行进度的数据结构

缺点: 执行效率低

典型应用:

  1. 专家系统
  2. java:一次编写,到处运行
  3. 仿真硬件执行过程

4.2 基于规则

组成:

  1. 规则集。
  2. 规则解释器
  3. 规则/数据选择器
  4. 工作内存

典型应用: 人工智能、DSS(决策支持系统)


5. 仓库风格

整体风格: 中央数据结构保存当前状态,独立构件对中央数据进行操作。

5.1 数据库系统

组成:

  1. 中央共享数据源:保存系统的当前数据状态。
  2. 多个独立处理元素:处理元素对数据元素进行操作

5.2 黑板系统

在这里插入图片描述

特点: 是一种问题求解模型,是组织推理步骤、控制状态数据、问题求解领域知识的概念框架。

组成:

  1. 知识源:包含独立的、与应用程序相关的知识,知识源之间不直接进行通信,只能通过黑板完成。
  2. 黑板数据结构:是按照与应用程序相关的层次来组织的解决问题的数据,知识源通过不断地改变黑板数据来解决问题。
  3. 控制:控制完全由黑板的状态驱动,黑板的状态改变决定使用的特定知识。

适用领域:

  1. 解决复杂的非结构化问题
  2. 能在求解的过程中综合运用多种不同知识源

典型应用:

  1. 信号处理:语音识别
  2. 编译优化
  3. 松耦合代理数据共享存取

5.3 超文本系统

典型应用: 静态网页


6. 其他架构风格

6.1 闭环控制架构

特点: 通过收集实际和理想的过程状态信息,并调整过程变量使得实际状态趋于理想状态。
缺点: 不适合复杂任务
典型应用: 嵌入式系统,涉及连续的动作与状态

6.2 C2

todo

猜你喜欢

转载自blog.csdn.net/weixin_43854928/article/details/121056846