在管道/过滤器风格的软件体系结构中,每一个构件都有一组输入和输出,构件读输入的数据流,通过内部处理,而后产生输出数据流。这个过程一般经过对输入流的变换及增量计算来完成,因此在输入被彻底消费以前,输出便产生了。所以,这里的构件被称为过滤器,这种风格的链接件就象是数据流传输的管道,将一个过滤器的输出传到另外一过滤器的输入。此风格特别重要的过滤器必须是独立的实体,它不能与其它的过滤器共享数据,并且一个过滤器不知道它上游和下游的标识。一个管道/过滤器网络输出的正确性并不依赖于过滤器进行增量计算过程的顺序。shell
如图是管道/过滤器风格的示意图。一个典型的管道/过滤器体系结构的例子是以Unix shell编写的程序。Unix既提供一种符号,以链接各组成部分(Unix的进程),又提供某种进程运行时机制以实现管道。另外一个著名的例子是传统的编译器。传统的编译器一直被认为是一种管道系统,在该系统中,一个阶段(包括词法分析、语法分析、语义分析和代码生成)的输出是另外一个阶段的输入。网络
管道/过滤器风格的软件体系结构具备许多很好的特色:
(1)使得软构件具备良好的隐蔽性和高内聚、低耦合的特色;
(2)容许设计者将整个系统的输入/输出行为当作是多个过滤器的行为的简单合成;
(3)支持软件重用。重要提供适合在两个过滤器之间传送的数据,任何两个过滤器均可被链接起来;
(4)系统维护和加强系统性能简单。新的过滤器能够添加到现有系统中来;旧的能够被改进的过滤器替换掉;
(5)容许对一些如吞吐量、死锁等属性的分析;
(6)支持并行执行。每一个过滤器是做为一个单独的任务完成,所以可与其它任务并行执行。
可是,这样的系统也存在着若干不利因素。
(1)一般致使进程成为批处理的结构。这是由于虽然过滤器可增量式地处理数据,但它们是独立的,因此设计者必须将每一个过滤器当作一个完整的从输入到输出的转换。
(2)不适合处理交互的应用。当须要增量地显示改变时,这个问题尤其严重。
(3)由于在数据传输上没有通用的标准,每一个过滤器都增长了解析和合成数据的工做,这样就致使了系统性能降低,并增长了编写过滤器的复杂性。性能