管道-过滤器模式
模式简介
管道-过滤器模式是一种面向数据流的软件体系结构。主要由管道和过滤器组成,过滤器为一个具体的处理模块,接受输入数据然后进行一定的处理,最后进行输出;管道是传输数据的组件,用于将数据从一个过滤器的输出接口传送到下一个过滤器的输入接口。
管道-过滤器模式可以很好地实现功能分解,通过将不同的功能用不同的过滤器进行实现,然后在用管道将各个过滤器相连,可以很好地实现封装与功能分解,利用管道-过滤器模式架构开发的软件可以很好地进行移植,提高了软件模块的重用性,同时也可以方便地将某一个旧过滤器用一个新过滤器进行更换,实现功能的修改或者更新,而不用修改软件项目中其他的过滤器。
模式具体结构组成
管道-过滤器模式由两大组件构成。一个为过滤器,另一个为管道。
过滤器:主要功能为从输入接口中读取数据,然后经过特定的处理,将结果数据置于输出接口。过滤器是一个独立的实体,只负责自身的处理,不用考虑其他过滤器的输入和输出数据。过滤器分为三类,分别为输入过滤器、处理过滤器和输出过滤器。
管道:是连接各个过滤器的组件,负责过滤器间数据的传输,充当过滤器之间数据流的通道。
模式优缺点
优点:
- 符合高内聚、低耦合的设计原则,可以方便地对过滤器进行替换或删除等操作。
- 支持模块的重用,可以将单个独立的过滤器应用到其他软件系统中
- 支持并行执行。每个过滤器是一个独立的实体,可以单独运行,不受其他过滤器影响。
缺点:
- 不适合处理交互的应用。
- 传输的数据没有标准化,所以读入数据和输出数据存在着格式转换等问题,会导致性能的降低。
特定环境
一个软件的处理流程由多个复杂的过程组成,而且每个处理过程依次执行,前一个处理为后一个处理提供必要的数据,后一个过程需要前一个过程提供数据支持。每个复杂的过程有自己独特的处理逻辑,可以对输入数据全部进行处理,也可以根据自己的特定情况只对一部分数据进行处理,或者作出一些特定的动作,最后输出最终的结果作为软件的执行结果。
特定环境中的问题
软件由多个复杂的处理流程组成,每个处理有自己独特的处理逻辑,流程不容易控制,每个流程的输出不容易得到及时的反馈,编写代码较为复杂,处理流程混乱,不容易形成体系结构,不容易进行任务的分解与分工,而且代码不容易测试及维护。
问题解决方案
采用管道-过滤器模式进行软件体系结构的设计。软件由多个独立的处理刘才能组成,则将每个处理流程当做一个过滤器,过滤器是由一个输入接口、一个处理模块和一个输出接口组成,而且是一个独立的实体。满足处理过程的独立处理,接受输入和输出的要求。而且过滤器有自己的处理机制,可以对所有的输入都进行处理,还可以对一部分数据进行处理,还可以进行数据的检测,当数据不满足要求时,可以及时地做出回应,进行错误处理。而且管道作为数据的传输介质在过滤器之间进行数据的传输,很好地满足了流程的处理。同时在满足系统要求的情况下很好地满足了代码的分解,形成了很多独立的过滤器模块,使软件代码解耦合,做到了高内聚、低耦合的设计原则,所以很容易进行测试和维护,在某些过滤器需要替换或删除时,可以很好地进行操作,而不需要修改太多的代码,而且也不会影响到其他的过滤器,同时过滤器还可以重用。提高了代码的可重用性。所以通过应用管道-过滤器模式可以很好地解决软件需要进行流程处理的需求。
模式结构图
应用实例
最典型的应用是编译系统,编译系统主要包括词法分析器,语法分析器,语义分析与中间代码生成器,优化器,目标代码生成器等对源程序进行处理的过程。可以将每个处理过程看做一个过滤器,然后通过管道进行连接,然后就组成了一个编译系统。
如上图所示源程序输入到编译系统,编译系统先经过词法分析过滤器,词法分析过滤器读取输入的数据,然后进行词法分析按词法规则得出各类单词,最后将分析得出的结果在输出接口输出;管道将该词法分析结果传送到语义分析过滤器,语义分析与中间代码生成过滤器检测程序代码有无语义错误,没有错误则生成中间代码并输出,若有错则进行错误处理;然后再经管道将中间代码传送到优化器,…按照过滤器处理,管道进行数据传送这种模式最终得到编译后的数据,这就是管道-过滤器的最典型的应用。
参考文献:
- 李小龙,毛文林. 管道-过滤器模式的软件体系结构及其设计[J]. 计算机工程与应用,2003,(35):114-115+182.
- 蒋庆. 新型管道—过滤器模式的研究及其应用[D].江西师范大学,2004.