管道和过滤器模式 Pipes and Filters Pattern
描述
把复杂的任务分解成一系列可以重复执行的单元。这种模式通过独立部署任务的方式来提高性能,可扩展性和可重用性。
背景和问题
一个应用程序可能需要执行各种不同的复杂任务。拆解这些复杂的任务,可以提高各个部件的重用率。
解决方案
复杂任务中的数据流分解成一组组件(过滤器),每个组件执行单个小任务,这些过滤器可以组合在一起成为一个管道。这个模式适合数据流系统,每个处理步骤都封装在一个过滤器内。
使用管道和过滤器与补偿交易模式相结合的模式可以提供一种替代的方法来实现分布式事务。分布式事务可以被分解成单独的任务,每个都可以通过使用一个过滤器。
注意事项
- 复杂性。这种模式非常复杂,过滤器分布在不同的服务器中。
- 可靠性。需要保证过滤器之间流动的数据不会丢失。
- 幂等性。一个任务可能被多次执行。
何时使用
由一个应用程序所需的处理可以很容易地被分解成一组离散的,独立的步骤。
结构中包含的角色
- Filter 过滤器
- FilterA
- FilterB
- Pipe 抽象管道
- PipeA 管道A
可用到的设计模式思维
管道中有多个过滤器,过滤器与过滤器串联在一起,这是典型的责任链模式。
最小可表达代码
// 过滤器
interface Filter
{
public function handle();
}
// 过滤器A
class FilterA implements Filter
{
public function handle()
{
var_dump("执行过滤器A");
}
}
// 过滤器B
class FilterB implements Filter
{
public function handle()
{
var_dump("执行过滤器B");
}
}
// 抽象管道
interface Pipe
{
public function handle();
}
// 管道A
class PipeA implements Pipe
{
private $filters = [];
public function __construct()
{
$this->filters[] = new FilterA();
$this->filters[] = new FilterB();
}
public function handle()
{
foreach ($this->filters as $filter) {
$filter->handle();
}
}
}
// 调试
(new PipeA)->handle();
推荐文章: