分治思维谈管道模式

本文摘自我的公众号:【陶朱公Boy】。也欢迎大家关注我的公众号,里面有很多优质的文章包括架构、面试、学习方法论等。

分治思维谈管道模式

文章:《分治思维谈管道模式》

回复关键字” pipeline“进行源码下载!

概述

今天跟大家分享一个程序员的底层思维-分治思维。

分治(Divid and Conquer)思想,是一种古老的、非常有效的思想。传说,罗马帝国的凯撒大帝就是采用这一思想策略征服了高卢人。

分治,从字面理解,就是分而治之;然而,分而治之并不是分治的全部。

实际上,除了我们常规理解的”分治” 即”分解+治理”,”分治并” 也是一种分治。分治并的过程是”分解+治理+合并”,合并的过程往往容易被忽视,但是实际应用中却很常见。比如,分治算法都有一个先分后合的过程;

再比如,分布式系统架构比如Hadoop,Map是分的过程,而Reduce是合的过程。

大部分问题可以通过分治解决,比如设计模式(管道模式)中的分治、团队拆分、分布式服务拆分等,然而另一些问题需要分治并,即分治算法和Hadoop来解决。

今天跟大家分享的管道模式其实就是分治思想的体现。

什么是管道模式

分治思维谈管道模式

图一:家庭的自来水前置VS后置过滤器,经过层层过滤,能帮我们过滤源头自来水的铜锈、颗粒杂质等;让我们喝到没有杂质的纯净水。

其实上述的这种过滤器层层处理的方式就是典型的分治思想。

在计算机世界中,也有很多这种思想的应用。

最有名的当属UNIX或者Linux中的管道了。

大家先看一个例子:

分治思维谈管道模式

这个命令行中间起连接作用的竖杠符号”|”就是所谓的管道,类似自来水的管道,起到了阀门和连接的作用。

同样在管道设计模式中,主要有以下两个角色。

(1)阀门(Valve):用于处理数据的节点。

(2)管道(pipeline):用于组织各个阀门,串接各个阀门完成工作。

Valve和pipeline源自一些开源中间件比如Tomcat等术语。
实现思路上使用一个单向链表数据结构作为管道的实现。

如下图所示。在一个pipeline中,由Head Valve接受一个输入,再经由一个或多个Valve进行处理,最后由Tail Valve输出结果。

分治思维谈管道模式

有什么用?解决了什么问题?

我举几个现实生活中的场景举例说明一下:

微服务拆分

看了图一的管道示意图,大家有没有发现跟我们平时在开发的分布式应用很像,团队内部拆分了很多应用,调用的时候,形成了上下游调用关系,比如订单服务->库存服务等。这个就是分治d 思想体现。

2. 团队组织架构的拆分

一个技术团队,需要区分前端、后端、测试、UI、运维等吧。

代码实现

基于上述思想,我用Java来简单实现一版管道模式。

我们先定义一个阀门接口:

有一个setNext方法,每一个阀门处理完后需要流转进入下一个阀门。invoke方法是每一个阀门的处理入口。

分治思维谈管道模式

我们再定义一个阀门抽象类

我们抽象一个公共的阀门抽象类。此类实现了阀门接口。对setNext和getNext进行了简单封装。对invoke方法进行abstract修饰,目的是各个子类自己去实现该方法。比如具体的阀门:前置过滤器 Or 后置管理器等等。按照自己的特性过滤自己的行为。妥妥的模板设计模式。

分治思维谈管道模式

接下来是具体的抽象子类,也就是各个真正的阀门实现类。

这个阀门类,替换”11″字符串成”first”内容。

处理成功后调用下一个”阀门”。

分治思维谈管道模式

阀门1

分治思维谈管道模式

阀门2

我们定义一个管道接口

此接口起到了串联各个阀门的作用。内部包含头部、中间、尾部阀门。

分治思维谈管道模式

最后定义一个管道的实现类”StandardPipeline”

addValve方法用于固定”首阀门”,然后在”首阀门”存在的情况下源源不断的有序的插入”阀门”直到”Tail阀门”节点。

分治思维谈管道模式

本地Demo测试一下

我们写一个Demo来跑下,看下效果。

分治思维谈管道模式

输出如下:

分治思维谈管道模式

结尾

通过以上步骤,我们用代码简单实现一个”管道模式”。建议大家下载源码(公众号【陶朱公Boy】回复”pipeline”下载)本地跑一下,这样才能更加深入的把握细节,理解的也更透彻!

本文完!

Original: https://www.cnblogs.com/StarbucksBoy/p/16635029.html
Author: 陶朱公Boy
Title: 分治思维谈管道模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/616774/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • springboot jrebel热部署

    安装 IDEA点击File -> Settings -> Plugins,如下图:搜索JRebel安装 完美破解 服务器地址监听服务器地址: http://jrebel…

    Java 2023年5月30日
    095
  • 难搞的偏向锁终于被 Java 移除了

    背景 在 JDK1.5 之前,面对 Java 并发问题, synchronized 是一招鲜的解决方案: 普通同步方法,锁上当前实例对象 静态同步方法,锁上当前类 Class 对象…

    Java 2023年6月5日
    077
  • PTA第6、7、8次作业的总结

    前言 这三次pta作业主要考查了电信计费系列的问题,从一开始的座机计费,再到座机计费与手机计费结合,最后到短信计费。其中座机计费与手机计费是难度最大的一次题目,因为它综合考虑的因素…

    Java 2023年6月5日
    059
  • 【笔记整理】SpringBoot集成腾讯云短信

    前言 记录一下最近使用SpringBoot基础腾讯云里的短信产品功能的体验。 1、腾讯云申请开通短信服务。 2、配置短信内容:分别创建签名、模板和群发短信。 3、使用SpringB…

    Java 2023年6月5日
    075
  • Java的线程状态

    在我们平时写code的时候,经常会使用到多线程。其中线程所处的状态就是我们需要进程思考的问题。 线程有哪些状态 NEW: 一个线程刚被创建,但是没有被使用就是处于这个状态RUNNA…

    Java 2023年6月7日
    088
  • Vue

    Vue 学习目标 前端知识体系 HTML(页面的结构)、CSS(表现层)、JavaScript(行为) HTML 就不说了。 CSS CSS层叠样式是一门标记语言,并不是编程语言,…

    Java 2023年6月5日
    085
  • 理解Java BlockingQueue

    数据结构与算法是天生一对。 BlockingQueue叫做阻塞队列,在Java线程池相关的实现中有广泛的使用。 BlockingQueue实现的功能如下: 当队列为空时,往队列中读…

    Java 2023年5月29日
    070
  • 搭建一个通用监控告警平台,架构上需要有哪些设计

    大家好,又见面了。 说到监控告警平台,大家应该都不会陌生,对于线上系统而言可以说是个标配,各个公司或项目也都会有搭建自己的监控告警平台的实际诉求。 当前比较主流的监控告警平台实现方…

    Java 2023年6月7日
    088
  • 面试题

    Redis 用过Redis吗,它使用在哪些地方(使用场景)?(阿里一面) 为什么用Redis做排行榜?(阿里一面) 如何保持Redis和MySQL数据一致?(阿里一面) poste…

    Java 2023年6月15日
    087
  • Docker-Compose实现Mysql主从

    1. 简介 通过使用 docker-compose搭建一个主从数据库,本示例为了解耦 将两个server拆分到了两个compose文件中,当然也可以放到一个compose文件中 演…

    Java 2023年6月7日
    082
  • SpringBoot:SpringBoot项目启动后立即执行函数的两种方式

    前言 有时启动SpringBoot项目后需要自运行函数来满足一些项目需求,下面介绍三种方式以此实现。 一、定义实体类实现ApplicationRunner接口 @Component…

    Java 2023年5月30日
    069
  • SpringAMQP的使用

    SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便。 SpringAmqp的官方地址:https://sp…

    Java 2023年6月7日
    074
  • Redis-firewall使用命令

    Redis-firewall使用命令 一、iptables防火墙 1、基本操作 查看防火墙状态 service iptables status 停止防火墙 service ipta…

    Java 2023年6月5日
    062
  • SpringMVC(7)-ssm整合实现增删改查-SpringMVC层

    1引言:这里主要做三件事 1.1resources文件夹下创建spring-mvc.xml并配置:开启注解驱动(mvc:annotation-driven),静态资源过滤(mvc:…

    Java 2023年6月9日
    066
  • springcloud alibaba 集成 nacos注册中心配置使用

    pom <span class="hljs-tag"><<span class="hljs-name">pro…

    Java 2023年6月7日
    073
  • (读书笔记)基于CMMI的软件工程及实训指导 第13-16章

    一、软件测试 软件测试是为了发现程序中的错误而执行的过程。测试只能证明软件有错,而不能保证软件程序没错。 1. 软件版本 Alpha版 公司内测版本 Beta版 对外公测版本 发布…

    Java 2023年6月5日
    092
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球