管道和过滤器模式 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 网站上。

上一篇 下一篇
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
发起讨论 查看所有版本


暂无话题~