2009年4月21日星期二

Pipes and Filters pattern的概念和实现

对于the Pipes and Filters pattern,书中提到了几个概念:管道(Pipe),过滤器(Filter),数据源(Data source),数据渊(Data sink)。管道用于传输,缓冲和同步数据,它可以与数据渊,数据渊,过滤器协作;过滤器用于获得输入数据,执行相应的操作,输出数据,它与管道进行协作;数据源用于将待处理的输入数据传给管道,它与管道协作;数据渊用于收集输出数据,它与管道协作。

另一个概念就是主动和被动,管道,数据源,数据渊都有主动和被动之分,两者的区别,一个是主动的去获取或者输出数据(书中的pull和push),而被动的则是通过外界触发,例如事件,或者相应的协作对象调用来触发。

Pipes and Filters 的实现:
1,将系统任务分为一个顺序的执行状态。没个状态只依赖他的直接前驱的输出,也就是说这些执行状态是一个线性的结构,第n+1个状态只依赖于第n个状态的输出结果(直接前驱),而不是还依赖与其它的前驱。
2,定义在管道中传输的数据的格式。为数据定义一个统一的格式可以有效地提高可扩展性,因为这样一来,就可以通过组合不同的过滤器以实现不同的功能,因为数据的格式是统一的,所以各个过滤器的前后次序不必担心,如果数据的格式不统一,那么调整过滤器的顺序就要大费周章,因为过滤器输入输出的数据格式不一样,调整过滤器的顺序需要进行大量的修改。
3,决定如何实现管道的连接。可以通过直接调用的方式来实现管道的连接,例如前驱的过滤器直接调用后续的过滤器中的方法,这种管道的实现方式可以实现数据的传输,但是这种方式的缺点是不言而喻的,就是耦合性太强了,一旦需要调整过滤器的位置,那么大规模的修改是不可避免的。比较好的方式是利用操作系统提供的相关特性来实现管道,例如可以用Windows下的message queue等用于进程间通信的方式,在Linux下用管道来实现。
4,设计和实现过滤器。过滤器的实现要考虑前面提到的主动和被动方式,对于被动型的过滤器,可以用一个或者一组函数来实现即可;而对于主动型过滤器,应该考虑用线程或者进程来实现。
5,设计错误处理。

没有评论:

发表评论