FP角度下的责任链模式(中间件模式,middleware)

责任链模式,十分常见,比如说,j2ee里的filter,express里的middleware,redux里的middleware

问题是:怎么才可以用最简单的方式实现一个责任链模式?
用数组,链表来记录中间件?这些都想过,后来终于找到一种很简单的方式,灵感来自于fp

使用者要的是什么

对于使用者来说,Middleware应该是不可见的,他们想要的只是最后的结果,也就是一个普通的函数:

input => output  

所以,先定义一个Function接口来表示:

1public interface Function { 2 Object apply(Object input); 3}

Middleware是什么

这个middleware最后抽象出来的样子,会决定我们后面的实现方式
Middleware跟Function的区别在于,Middleware除了能拿到input,它还能拿到"下一站"的Function
所以,middleware应该是一个能对Function进行AOP增强的东西:

1(input, Function) => output 2 3 4public interface Middleware { 5 Object apply(Object input, Function f); 6}

将Middleware结合到Function

最后,我们要实现一个结合函数:

(oldFunction, Middleware) => newFunction

就是说,给你一个oldFunction和一个Middleware,要返回一个newFunction,就是oldFunction通过Middleware增强以后的东西
这个newFunction,可以直接交给用户使用,又或者,可以继续给它增加Middleware

1public static Function combine(final Function f, final Middleware mid) { 2 return new Function() { 3 public Object apply(final Object input) { 4 return mid.apply(input, f); 5 } 6 }; 7}

可以看到,input是先流进Middleware的,然后里面干什么,就由这个Middleware决定了。

这样子,责任链就完成了,20行不到的代码。

1public class Chain { 2 public interface Function { 3 Object apply(Object input); 4 } 5 public interface Middleware { 6 Object apply(Object input, Function f); 7 } 8 public static Function combine(final Function f, final Middleware mid) { 9 return new Function() { 10 public Object apply(final Object input) { 11 return mid.apply(input, f); 12 } 13 }; 14 } 15} 16

与管道模式对比

FP是好东西,去掉了OO里面那些包装的概念,思考的时候会更简单直接。

管道模式,也就是unix里面CLI程序串接起来的模式,对应到fp,其实就是最简单的函数组合
h(x) | g | f 其实就是 f(g(h(x)))

将责任链模式 与 管道模式 对比,会发现,能力上,责任链是完胜管道的,因为责任链实际上是对Function的AOP增强,这种增强,可以是同时包含了前置的和后置的。
而管道模式的增强,只能是前置的(或者后置的)。

1管道模式 (Function, Function) => Function 2责任链模式 (Function, Middleware) => Function
点赞
收藏

评论区

加载中...

相关推荐

责任链和策略设计模式-基于Java编程语言

责任链和策略设计模式这两种设计模式非常实用,下面简单介绍一下我对这两种设计模式的理解和它们在Spring框架源码中的应用。

java实现23种设计模式之责任链模式

顾名思义,责任链模式(ChainofResponsibilityPattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。pa

Dubbo架构设计与源码解析(三)责任链模式

责任链模式是设计模式中简单且常见的设计模式,可能我们日常中也会经常应用责任链模式,dubbo中的责任链模式将灵活性发挥的很充分。

一分钟学会、三分钟上手、五分钟应用,快速上手责任链框架详解 | 京东云技术团队

责任链模式是开发过程中常用的一种设计模式,在SpringMVC、Netty等许多框架中均有实现。我们日常的开发中如果要使用责任链模式,通常需要自己来实现,但自己临时实现的责任链既不通用,也很容易产生框架与业务代码耦合不清的问题,增加CodeReview的成本。

我好像发现了一个Go的Bug?

从一次重构说起这事儿还得从一次重构优化说起。最近在重构一个路由功能,由于路由比较复杂,需求变化也多,于是想通过责任链模式来重构,刚好这段时间也在SentinelGo中看到相关源码。用责任链模式,最大的好处是可以针对每次请求灵活地插拔路由能力,如:这样实现会在每次请求到来时去new出整个责任链,可以预见对象会频繁的创建、销毁。对Java来说,对象池

Apache commons chain 初探

Apachecommonschain是什么Apachecommonchain是对责任链设计模式的改造封装,让使用者更加方便的使用。简单回顾一下责任链设计模式在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(ChainofResponsibility)模式的:责任链模式是一种对象的行为模式。在