管道是用链表实现的,注意头结点设为null,这样做是为了方便插入节点。

这种思想在很多地方都有体现,如AbstractQueuedSynchronizer(抽象的队列同步器)。缩写aqs,它是JUC的基础。

每个任务都有handler来执行一个handler方法来执行这个任务。
pipeline模式将各个业务之间解耦了, 每个handler只需要关注它自己的任务即可,不需要关注上一个任务的执行过程。
如果再增加一个任务,只需要再增加一个handler即可。


注意事项

  1. 阀⻔的实现分两种,即普通阀⻔和尾阀⻔。普通阀⻔在处理完⾃⼰的事情之后,必须调⽤
    getNext.exec(s)⽅法,也就是交给下⼀个阀⻔处理;⽽尾阀⻔不⽤调⽤这个⽅法,因为它是结束
    的那个阀⻔。
  2. 流⽔线实现类的主要逻辑在addFirst和addLast,它持有⼀个头阀⻔和⼀个尾阀⻔,它按照添加阀
    ⻔顺序的⽅式构造阀⻔链表,按照队列的形式,决定调⽤的先后顺序
  3. Pipeline的深度:Pipeline中handler的个数被称作Pipeline的深度。所以我们在⽤Pipeline的深度与
    JVM宿主机的CPU个数间的关系。如果Pipeline实例所处的任务多属于CPU密集⾏,那么深度最好
    不超过Ncpu。如果Pipeline所处理的任务多属于I/O密集型,那么Pipeline的深度最好不要超过
    2*Ncpu。

总结⼀下Pipeline模式的优点,如下:
1、降低耦合度。它将请求的发送者和接收者解耦。
2、简化了Handler处理器。使得处理器不需要知道链的结构。也就是Handler处理器可以是⽆状态的。
与责任链(流⽔线)相关的状态,交给了Context去维护。
3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删
除责任。
4、 增加新的请求处理器很⽅便。


来看一下pipeline设计模式在订单模块中的应用:
TransOutboundInvoker(管道接口):

package com.mall.order.biz;import com.mall.order.biz.context.TransHandlerContext;/***  ciggar* create-date: 2019/8/2-下午9:58*/
public interface TransOutboundInvoker {/*** 启动流程.<br/>**/void start();/*** 终止流程.<br/>**/void shutdown();/*** 用于获取返回值<br/>** @return*/<T extends TransHandlerContext> T getContext();
}

TransPipeline:

package com.mall.order.biz.handler;/*** Created by ciggar on 2019/8/2.*/import com.mall.order.biz.TransOutboundInvoker;/***  ciggar* create-date: 2019/8/2-下午9:58*/
public interface TransPipeline extends TransOutboundInvoker {/**** @param handlers*/void addFirst(TransHandler... handlers);/**** @param handlers*/void addLast(TransHandler ... handlers);
}

DefaultTransPipeline(管道对象的实现):

package com.mall.order.biz.handler;/*** Created by ciggar on 2019/8/2.*/import com.mall.order.biz.context.TransHandlerContext;
import lombok.extern.slf4j.Slf4j;/***  ciggar* create-date: 2019/8/2-下午10:37*/
@Slf4j
public class DefaultTransPipeline implements TransPipeline{private TransHandlerNode tail;private TransHandlerNode head = new TransHandlerNode();private TransHandlerContext context = null;public DefaultTransPipeline(TransHandlerContext context) {setContext(context);tail = head;}@Overridepublic void addFirst(TransHandler... handlers) {TransHandlerNode pre = head.getNext();for (TransHandler handler : handlers) {if(handler == null) {continue;}TransHandlerNode node = new TransHandlerNode();node.setHandler(handler);node.setNext(pre);pre = node;}head.setNext(pre);}@Overridepublic void addLast(TransHandler... handlers) {TransHandlerNode next = tail;for (TransHandler handler : handlers) {if(handler == null) {continue;}TransHandlerNode node = new TransHandlerNode();node.setHandler(handler);next.setNext(node);next = node;}tail = next;}@Overridepublic void start() {try {head.getNext().exec(getContext());} catch (Exception ex) {log.error("pipeline系统运行异常.", ex);throw ex;}}@Overridepublic void shutdown() {;}@Overridepublic <T extends TransHandlerContext> T getContext() {return (T)context;}public void setContext(TransHandlerContext context) {this.context = context;}
}

在创建订单的时候使用到了pipeline模式:
OrderServiceImpl:

 public CreateOrderResponse createOrder(CreateOrderRequest request) {CreateOrderResponse response = new CreateOrderResponse();try {//创建pipeline对象TransOutboundInvoker invoker = orderProcessPipelineFactory.build(request);//启动pipelineinvoker.start(); //启动流程(pipeline来处理)//获取处理结果AbsTransHandlerContext context = invoker.getContext();//把处理结果转换为responseresponse = (CreateOrderResponse) context.getConvert().convertCtx2Respond(context);response.setCode(OrderRetCode.SUCCESS.getCode());response.setMsg("success");} catch (Exception e) {log.error("OrderCoreServiceImpl.createOrder Occur Exception :" + e);ExceptionProcessorUtils.wrapperHandlerException(response, e);response.setCode(OrderRetCode.DB_EXCEPTION.getCode());return response;}return response;}

对照pdf一起看。

pipeline设计模式相关推荐

  1. [设计模式] Pipeline 设计模式

    深析Pipeline设计模式 - 知乎目标通过提供初始输入并传递处理后的输出以供下一阶段使用,从而允许在一系列阶段中进行数据处理. 解释Pipeline模式为管道模式,也称为流水线模式.通过预先设定好 ...

  2. Pipeline 设计模式的优缺点和实践案例

    作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,<性能优化方法论>作者.<解锁大厂思维:剖析<阿里巴巴Java开发手册>>.<再学经 ...

  3. Laravel 中管道设计模式的使用 —— 中间件实现原理探究

    所谓管道(Pipeline)设计模式就是将会数据传递到一个任务序列中,管道扮演者流水线的角色,数据在这里被处理然后传递到下一个步骤. 使用管道使用很多好处的,尤其是在单个任务中编写复杂处理代码时管道为 ...

  4. 十二种常见设计模式代码详解

    零:设计模式分类 设计模式有创建型模式.结构型模式与行为型模式 创建型:单例模式.工厂模式(简单工厂,工厂方法,抽象工厂) 结构型:适配器模式.门面模式.装饰器模式.注册树模式.代理模式.管道模式 行 ...

  5. 腾讯新闻基于Flink PipeLine模式的实践

    本文作者:腾讯新闻商业化数据高级工程师 罗强 摘要   随着社会消费模式以及经济形态的发展变化,将催生新的商业模式.腾讯新闻作为一款集游戏.教育.电商等一体的新闻资讯平台.服务亿万用户,业务应用多.数 ...

  6. 腾讯新闻基于 Flink PipeLine 模式的实践

    ​摘要:   随着社会消费模式以及经济形态的发展变化,将催生新的商业模式.腾讯新闻作为一款集游戏.教育.电商等一体的新闻资讯平台.服务亿万用户,业务应用多.数据量大.加之业务增长.场景更加复杂,业务对 ...

  7. Netty 源码(ChannelHandler 死磕)

    精进篇:netty源码死磕5  - 揭开 ChannelHandler 的神秘面纱 目录 1. 前言 2. Handler在经典Reactor中的角色 3. Handler在Netty中的坐标位置 4 ...

  8. 揭开netty神秘面纱_Netty 源码(ChannelHandler 死磕)

    疯狂创客圈   经典图书 : <Netty Zookeeper Redis 高并发实战>    面试必备 +  面试必备 + 面试必备 疯狂创客圈   经典图书 : <SpringC ...

  9. 八戒科技服务技术负责人鸿鹄真人:做好技术负责人的4个关键特质

    作者简介 猪八戒网后端技术委员成员&八戒科技服务技术负责人,中国商业联合会互联网协会智库顾问.国家软考高级系统架构师.国家软考高级系统分析师.TOGAF企业架构认证.国家软考系统集成项目经理. ...

最新文章

  1. mysql通过订单量排序_mysql8 参考手册--通过排序优化
  2. python的集合运算和set相关操作
  3. 腾讯微博即将关停,十年了,你用过吗?
  4. 30分钟搞定ES6常用基础知识
  5. 网上学python靠谱吗-0基础自学Python靠谱吗?如何快速学会?
  6. Windows Hello 可绕过漏洞进行身份认证
  7. AJPFX关于代码块的总结
  8. Springboot 关于日期时间格式化处理方式总结
  9. mysql long varchar2_案例:Oracle数据库long查询结果转换为varchar2类型方法的操作步骤...
  10. 下载mono太慢怎么办?
  11. 怎么读取二代身份证UUID----在STM32+CLRC663平台试验成功
  12. excel查标准正态分布_利用Excel的NORMSDIST计算正态分布函数表
  13. cad编程c语言,基于C.NET的AutoCAD二次开发简版.pdf
  14. ubuntu下运行.exe程序
  15. MySQL高级-(存储引擎、索引、锁)
  16. uni-app使用canvas将两张图片合成一张图片
  17. Cesium 热力图(可直接使用)
  18. Google Guava 实战之字符串处理篇
  19. 在Ubuntu 14.04 上安装 Nginx-RTMP 流媒体服务器,并Android真机测试
  20. 国外的站长如何做SEO优化?

热门文章

  1. c语言程序设计的实验报告,C语言程序设计实验报告
  2. Windows 10 虚拟桌面切换
  3. DPDK中的cuckoo hash算法
  4. 计算机性能过低配色方案,系统之家windows7提示更改配色方案提高性能的方法
  5. 互联网行业人事频繁变动:高速发展之忧
  6. java 过滤关键字 自定义字典库
  7. 写好用户故事的10个提示
  8. 工程技术人员以计算机为辅助工具,上海工程技术大学机械CADCAM考试复习资料
  9. 10-200 C2-2修改特定职工的订单运费
  10. CodeForces - 108A Palindromic Times