分治思维谈管道模式
文章:《分治思维谈管道模式》
回复关键字” pipeline“进行源码下载!
概述
今天跟大家分享一个程序员的底层思维-分治思维。
分治(Divid and Conquer)思想,是一种古老的、非常有效的思想
文章:《分治思维谈管道模式》 回复关键字” pipeline“进行源码下载! 概述 今天跟大家分享一个程序员的底层思维-分治思维。 分治(Divid and Conquer)思想,是一种古老的、非常有效的思想。传说,罗马帝国的凯撒大帝就是采用这一思想策略征服了高卢人。 分而治之,字面意思就是分而治之;然而,分而治之并不是分而治之的全部。 [En] Divide and rule, literally, is divide and rule; however, divide and rule is not the whole thing of divide and rule. 实际上,除了我们常规理解的”分治” 即”分解+治理”,”分治并” 也是一种分治。分治并的过程是”分解+治理+合并”,合并的过程往往容易被忽视,但是实际应用中却很常见。比如,分治算法都有一个先分后合的过程; 再比如,分布式系统架构比如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 后置管理器等等。按照自己的特性过滤自己的行为。妥妥的模板设计模式。 接下来是具体的抽象子类UNIX 管道和过滤器,也就是各个真正的阀门实现类。 这个阀门类,替换”11″字符串成”first”内容。 处理成功后调用下一个”阀门”。 阀门1 阀门2 我们定义一个管道接口 此接口起到了串联各个阀门的作用。内部包含头部、中间、尾部阀门。 最后定义一个管道的实现类”StandardPipeline” addValve方法用于固定”首阀门”,然后在”首阀门”存在的情况下源源不断的有序的插入”阀门”直到”Tail阀门”节点。 本地Demo测试一下 我们写一个Demo来跑下,看下效果。 输出如下: 结尾 通过以上步骤,我们用代码简单实现一个”管道模式”。建议大家下载源码(公众号【陶朱公Boy】回复”pipeline”下载)本地跑一下,这样才能更加深入的把握细节,理解的也更透彻! 本文完! Original: Author: 陶朱公Boy Title: 分治思维谈管道模式 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |