前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >责任链模式 Chain of Responsibility Pattern

责任链模式 Chain of Responsibility Pattern

作者头像
FoamValue
发布2022-12-20 16:33:53
2020
发布2022-12-20 16:33:53
举报
文章被收录于专栏:FoamValueFoamValue

【概念】

为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

【结构】

  • 抽象处理者(Handler):定义一个处理请求的抽象方法(handler),以及设置下一个处理者(setNext)。
  • 具体处理者(Concrete Handler):实现抽象处理者(Handler)的抽象方法(handler),并在业务逻辑中判断是否传递给下一个具体处理者(getNext)。
  • 客户类(Client):创建处理链,并向链头的具体处理者对象提交请求。

【演示代码】

抽象处理者

代码语言:javascript
复制
package com.test;

public abstract class Handler {

    private Handler next;

    public Handler getNext() {
        return next;
    }

    public void setNext(Handler next) {
        this.next = next;
    }

    public abstract void handler();
}

具体处理者01

代码语言:javascript
复制
package com.test;

public class ConcreteHandler01 extends Handler {

    @Override
    public void handler() {
        System.out.println("this is ConcreteHandler01");

        if (getNext() != null) {
            getNext().handler();
        }
    }
}

具体处理者02

代码语言:javascript
复制
package com.test;

public class ConcreteHandler02 extends Handler {

    @Override
    public void handler() {
        System.out.println("this is ConcreteHandler02");

        if (getNext() != null) {
            getNext().handler();
        }
    }
}

客户类

代码语言:javascript
复制
package com.test;

public class Client {

    public static void main(String[] args) {
        Handler handler01 = new ConcreteHandler01();
        Handler handler02 = new ConcreteHandler02();

        handler01.setNext(handler02);
        handler01.handler();
    }
}

运行结果

代码语言:javascript
复制
this is ConcreteHandler01
this is ConcreteHandler02

进程已结束,退出代码0

【经典案例:Interceptor】

抽象处理者:HandlerInterceptor

具体处理者(之一):RequestContextInterceptor

客户类:HandlerExecutionChain

(1)创建处理链

(2)执行处理链

【尾声】

Handler 可以是接口类,即 Concrete Handler 是接口实现类。

Client 可以是 Chain 类,即维护一个 List<Handler> 对象,按列表顺序进行执行处理链。

综上,这是一个非常棒的设计模式,特别是用来处理将一个大集合变成一个小集合的业务逻辑。例如:提取符合某些特定条件的会员数据,推送营销消息。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Alan 手记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档