管道和过滤器,需要澄清

时间:2012-01-29 03:26:43

标签: architectural-patterns

关于管道和过滤器的几个问题。

enter image description here

在此示例中,如上图所示,实施时:

  1. 每个Pipe应该在一个单独的线程中运行吗?
  2. 每个Filter应该在一个单独的线程中运行吗?
  3. 公平地说,Pump只“了解”它看到的第一个管道并且对世界其他地方一无所知?另外,可以公平地说每个组件“只知道”一个之前和之后的组件吗?
  4. 换句话说,过滤器将检查是否有数据准备好接收和处理,然后只有1.处理它并且2.将它传递给下一个管道?

1 个答案:

答案 0 :(得分:5)

管道和过滤器是 divide-et-impera 的一个应用程序,它采用模块化,旨在通过配置所涉及的模块来实现,并具有多功能性。

在解决涉及源流或对象或信号的多次处理运行的问题时,它找到最有用的,并请求生成修改的流或对象或相同类型的信号。

它基于简单的小处理单元,称为 filter ,它们都遵循相同的契约(它们在输入中获得相同的对象/流类型和可选参数,并返回已处理的流/宾语)。每个滤波器输​​入可以连接到(另一个或另一个自身实例)滤波器输出,或连接到源(称为 pump ),类似地,每个滤波器输​​出可以连接到滤波器输入或连接到architecture return object / steam(称为 sink )。连接单元称为 pipe ,并由管理器类用于通过过滤器中完成的不同处理步骤来路由流/对象/信号。

指定合同的协议是每个过滤器可以自动行动,而不需要了解其他过滤器或整个流程处理。这意味着过滤器也可以透明地互换,产生不同的最终结果。

虽然过滤器实例可以在不同的流上同时运行,但管道和过滤器模式通常不用于并发操作,因为每个过滤器通常都需要访问同一个资源。

  • 软件示例:图像处理中的过滤器
  • 真实世界的例子:踏板效果处理吉他和放大器之间的声音信号。