使用管道--过滤器风格设计软件

管道--过滤器是一种比较早期的软件设计思路,主要思路是将软件系统看成各种功能模块的组合,功能模块从输入集合读入数据流,并在输出集合产生输出数据流,它最典型的应用是在编译系统。

阅读目标

在本文中,你将获得以下知识:

  • 了解管道-过滤器风格的设计思路
  • 使用该设计风格的时机和原因
  • 案例
  • 管道过滤器风格的优缺点

目录

阅读目标

简介

时机和原因

案例

优缺点

总结


简介

管道-过滤器模式的体系结构是面向数据流的软件体系结构。每个功能模块都有一组输入和输出,功能模块从输入集合读入数据流,并在输出集合产生输出数据流,在系统的构件中计算了一个数据集来产生另外一个数据集。在管道过滤器风格中,功能模块称作过滤器(Filter);功能模块间的链接可以看作输入、输出流之间的通路,所以称作管道(Pipe)。

原因和时机

管道-过滤器风格的特征之一在于过滤器的相对独立性,即过滤器独立完成自身功能,相互之间无需进行状态交互,且各个过滤器之间无需直到它的输入和输出管道所连接的过滤器的存在。每个过滤器仅仅需要对输入管道的输入流数流进行限制,并保证输出管道的输出数据流有合适的内容,并不知道连接在其输入、输出管道上的其他过滤器的实现细节。

使用管道的过滤器的时机在于需要将一个复杂任务拆解为一系列可管理的、离散的服务,并将它们组织成一条管道。在确保每个基本构件的函数满足单一职责原则,特定的输入总是产生相同的输出时,可以创建这样的一个黑盒,将其拼装起来组成的完整软件结构。

管道-过滤器风格的软件体系适合用在并行计算系统上,各个构件之间组成的系统相互独立,不存在数据共享的问题,在并行计算完成之后,各个子系统的结果汇总,就完成了计算任务。在早期的计算机的计算任务中比较常见,计算机只用来做计算,而不考虑系统交互。

案例

编译器就是经典的管道-过滤器风格

使用管道--过滤器风格设计软件_第1张图片 编译器模型
  • 预处理:负责宏展开和去掉注释等工作。
  • 编译:进行词法分析、语法分析、语义分析、分析代码优化和代码产生
  • 汇编:负责把汇编代码转换成机器指令,生成目标文件。
  • 链接:负责吧多个目标文件、静态裤和共享链接裤链接成可执行文件、共享库。

 如果将编译的过程再次细分下去:

使用管道--过滤器风格设计软件_第2张图片 编译构件

  • 词法分析:负责将源程序分解成一个一个的token,这些token是组成源程序的基本单元。
  • 语法分析:把词法分析得到的token解析成语法树。
  • 语义分析:对语法树进行类型检查等语义分析。
  • 代码优化:对语法树进行重组和修改,以优化代码的速度和大小。
  • 代码产生:根据语法树产生汇编代码。

在管道-过滤器风格体系结构的系统中,过滤器不必是原子的,一个过滤器可以分成许多子过滤器,这些子过滤器可以用连接器相互连接起来,例如下面简单例子,在这个例子中,一个字符串可以简单地分成一组单词,这些单词可以按照某种规则组成一个新的字符串,最后将这个新的字符串按字母顺序输出,模型如下所示:

使用管道--过滤器风格设计软件_第3张图片 简单的管道过滤器风格实例

 大致上而言,整个系统可以分为两个过滤器:分割过滤器和合并过滤器,如果输入一个字符串到这个过滤器中,此时这个字符串将会贝分割为一组单词,然后使出;合并排序过滤器可以从分割过滤器中接收这些输出的数据,再产生出新的字符串。从设计人员和分析人员的角度出发,他们都没有考虑合并排序过滤器是如何工作的,而仅关心过滤器的接口。

优缺点

优点

  1. 支持模块级别的重用,独立的过滤器减少了构件之间的耦合关系
  2. 由管道-过滤器组成的系统能够很容易地维护和扩展。因为此时只要考虑构件的输入、输出和内部实现,通过替换构件可以实现系统的升级,而如果需要扩展系统,添加新功能时,可以在原有构建上接入新的构件。
  3. 在管道过滤器风格中,过滤器构件的独立性提供了系统运行分析的便捷性,例如系统的吞吐量、死锁分析和计算准确性等。
  4. 支持并发计算。

缺点

  1. 过滤器对于输入和输出数据存在一些限制,不适合交互式系统
  2. 仅满足多计算任务的需求,无法实现数据共享。
  3. 过滤器之间进行数据交换需要大量的数据处理空间。

总结

管道-过滤器风格的软件体系,每个构件看成独立的个体。对于相同的输入,每个过滤器都能得到相同的输出结果,过滤器之间通过管道连接起来,就组成了完整的软件系统,系统的升级和扩展即新增过滤器构件。这样的系统只适合多计算任务的需求,而不能用在共享数据、用户交互设计的系统中。

你可能感兴趣的:(软件设计,软件架构)