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

Stella981
• 阅读 328

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

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

使用者要的是什么

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

input => output  

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

public interface Function {
    Object apply(Object input);
}

Middleware是什么

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

(input, Function) => output


public interface Middleware {
    Object apply(Object input, Function f);
}

将Middleware结合到Function

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

(oldFunction, Middleware) => newFunction

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

public static Function combine(final Function f, final Middleware mid) {
    return new Function() {
        public Object apply(final Object input) {
            return mid.apply(input, f);
        }
    };
}

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

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

public class Chain {
    public interface Function {
        Object apply(Object input);
    }
    public interface Middleware {
        Object apply(Object input, Function f);
    }
    public static Function combine(final Function f, final Middleware mid) {
        return new Function() {
            public Object apply(final Object input) {
                return mid.apply(input, f);
            }
        };
    }
}

与管道模式对比

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

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

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

管道模式   :  (Function, Function) => Function     
责任链模式 :  (Function, Middleware) => Function
点赞
收藏
评论区
推荐文章
责任链和策略设计模式-基于Java编程语言
责任链和策略设计模式这两种设计模式非常实用,下面简单介绍一下我对这两种设计模式的理解和它们在Spring框架源码中的应用。
Dubbo架构设计与源码解析(三)责任链模式
责任链模式是设计模式中简单且常见的设计模式,可能我们日常中也会经常应用责任链模式,dubbo中的责任链模式将灵活性发挥的很充分。
Wesley13 Wesley13
2年前
java实现23种设计模式之责任链模式
顾名思义,责任链模式(ChainofResponsibilityPattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。pa
捉虫大师 捉虫大师
2年前
我好像发现了一个Go的Bug?
从一次重构说起这事儿还得从一次重构优化说起。最近在重构一个路由功能,由于路由比较复杂,需求变化也多,于是想通过责任链模式来重构,刚好这段时间也在SentinelGo中看到相关源码。用责任链模式,最大的好处是可以针对每次请求灵活地插拔路由能力,如:这样实现会在每次请求到来时去new出整个责任链,可以预见对象会频繁的创建、销毁。对Java来说,对象池
京东云开发者 京东云开发者
12个月前
一分钟学会、三分钟上手、五分钟应用,快速上手责任链框架详解 | 京东云技术团队
责任链模式是开发过程中常用的一种设计模式,在SpringMVC、Netty等许多框架中均有实现。我们日常的开发中如果要使用责任链模式,通常需要自己来实现,但自己临时实现的责任链既不通用,也很容易产生框架与业务代码耦合不清的问题,增加CodeReview的成本。
Stella981 Stella981
2年前
Apache commons chain 初探
Apachecommonschain是什么Apachecommonchain是对责任链设计模式的改造封装,让使用者更加方便的使用。简单回顾一下责任链设计模式在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(ChainofResponsibility)模式的:责任链模式是一种对象的行为模式。在
Wesley13 Wesley13
2年前
Java描述设计模式(15):责任链模式
本文源码:GitHub·点这里(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2Fcicadasmile%2Fmodelarithmeticparent)||GitEE·点这里(https://gitee.com/cicadasmile/modela
Wesley13 Wesley13
2年前
Java设计模式之责任链模式
引入责任链模式责任链模式顾名思义,责任链模式(ChainofResponsibilityPattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会
Wesley13 Wesley13
2年前
Java设计模式从精通到入门一 责任链模式
​一直都想对设计模式有一个深刻的认识,这样对于阅读源码的时候就不会那么吃力了。于是有了想要记录下设计模式的笔记。打算从自己不怎么熟悉的设计模式开始写,里面穿插着一点自己的想法,希望自己写完后,会又一个更深刻的理解和流畅的表述。介绍​为请求创建了一个接受者的链,通常一个接收者包含下一个接受者的引用,如果该对象不能处理该请求,就传给下一个。依次
京东云开发者 京东云开发者
8个月前
一文带你读懂设计模式之责任链模式 | 京东云技术团队
翻了一下之前刚入职时候的学习笔记,发现之前在熟悉业务代码的时候曾经专门学习并整理过过设计模式中的责任链模式,之前只是对其简单了解过常用的设计模式有哪些,并未结合实例和源码深入对其探究,利用熟悉代码契机进行系统学习并整理文档如下。