管道和过滤器模式 Pipes and Filters Pattern

未匹配的标注

描述

    把复杂的任务分解成一系列可以重复执行的单元。这种模式通过独立部署任务的方式来提高性能,可扩展性和可重用性。

背景和问题

    一个应用程序可能需要执行各种不同的复杂任务。拆解这些复杂的任务,可以提高各个部件的重用率。

liaoliaophp 管道和过滤器模式

解决方案

复杂任务中的数据流分解成一组组件(过滤器),每个组件执行单个小任务,这些过滤器可以组合在一起成为一个管道。这个模式适合数据流系统,每个处理步骤都封装在一个过滤器内。

liaoliaophp 管道和过滤器模式

使用管道和过滤器与补偿交易模式相结合的模式可以提供一种替代的方法来实现分布式事务。分布式事务可以被分解成单独的任务,每个都可以通过使用一个过滤器。

liaoliaophp 管道和过滤器模式

注意事项

  1. 复杂性。这种模式非常复杂,过滤器分布在不同的服务器中。
  2. 可靠性。需要保证过滤器之间流动的数据不会丢失。
  3. 幂等性。一个任务可能被多次执行。

何时使用

由一个应用程序所需的处理可以很容易地被分解成一组离散的,独立的步骤。

结构中包含的角色

  1. Filter 过滤器
  2. FilterA
  3. FilterB
  4. Pipe 抽象管道
  5. 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();

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~