JAVA设计模式16:职责链模式,轻松解耦发送者和接收者

简介: JAVA设计模式16:职责链模式,轻松解耦发送者和接收者



一、什么是职责链模式

职责链模式是一种行为设计模式,它允许你将请求沿着处理链进行传递,直到有一个对象处理它为止。

在职责链模式中,每个处理者都有自己的处理逻辑和下一个处理者的引,当一个请求到达时,它首先由第一个处理者尝试处理,如果处理者能够处理该请求,则处理结束;如果处理者无法处理该请求,则将请求传递给下一个处理者,依次类推,直到有一个处理者处理请求或者处理链结束。

职责链模式主要优点是解耦了发送者和接收者,使得请求的发送者不需要知道请求是如何被处理的,也不需要知道具体的处理者是谁。这样可以方便地添加、删除或者重新排序处理者,灵活地组织处理链。

在 Java 中,职链模式通常由一个抽象处理者和多个具体处理者组成。抽象处理者定义了处理请求的接口和一个指向下一个处理者的引用,具体处理者实现了处理请求的方法,并决定是否将请求传递给下一个处理者使用职责链模式可以很好地解决以下 2 22 个场景。

  1. 在一个系统中,多个对象可以处理同一个请求,但是具体由哪个对象来处理需要运行时刻动态确定。
  2. 系统需要动态地组织和管理一条处理链,而不需要手动编写大量的条件语句。

总之,职责链模式可以帮助降低系统的耦合度,提高代码的灵活性和可扩展性。


二、职责链模式实例

下面是一个使用Java实现职责链模式的例子,请同学们复制到本地执行。

首先,我们需要创建一个抽象的处理者类,定义处理请求的接口和一个指向下一个处理者的引用,代码如下。

public abstract class Handler {
    protected Handler nextHandler;
    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }
    public abstract void handleRequest(Request request);
}

然后,我们创建具体的处理者(ConcreteHandler)类,实现处理请求的方法,并决定是否将请求传递给下一个处理者,代码如下。

public class ConcreteHandlerA extends Handler {
    @Override
    public void handleRequest(Request request) {
        if (request.getType().equals("TypeA")) {
            System.out.println("ConcreteHandlerA handles the request.");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}
public class ConcreteHandlerB extends Handler {
    @Override
    public void handleRequest(Request request) {
        if (request.getType().equals("TypeB")) {
            System.out.println("ConcreteHandlerB handles the request.");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}
public class ConcreteHandlerC extends Handler {
    @Override
    public void handleRequest(Request request) {
        if (request.getType().equals("TypeC")) {
            System.out.println("ConcreteHandlerC handles the request.");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

最后,我们创建一个请求(Request)类,用于封装需要处理的请求,代码如下。

public class Request {
    private String type;
    public Request(String type) {
        this.type = type;
    }
    public String getType() {
        return type;
    }
}

现在,我们可以创建一个处理链,并使用职责链模式处理请求,代码如下。

public class Main {
    public static void main(String[] args) {
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        Handler handlerC = new ConcreteHandlerC();
        handlerA.setNextHandler(handlerB);
        handlerB.setNextHandler(handlerC);
        Request request1 = new Request("TypeA");
        handlerA.handleRequest(request1);
        Request request2 = new Request("TypeB");
        handlerA.handleRequest(request2);
        Request request3 = new Request("TypeC");
        handlerA.handleRequest(request3);
    }
}

输出结果为:

ConcreteHandlerA handles the request.
ConcreteHandlerB handles the request.
ConcreteHandlerC handles the request.

在这个例子中,我们创建了三个具体的处理者,分别是 ConcreteHandlerAConcreteHandlerBConcreteHandlerC

每个处理者根据请求的类型来决定是否处理请求,如果不能处理,则将请求传递给下一个处理者。

最后,我们创建一个处理链,将处理者按顺序连接起来,并使用职责链模式处理请求。


三、职责链模式的应用场景

职责链模式适用于以下 4 44 个应用场景,请同学们认真学习。

  1. 请求发送者不关心请求的处理细节:职责链模式将发送者和接收者解耦,发送者不需要知道请求是如何被处理的,也不需要知道具体的处理者是谁。这样可以方便地添加、删除或者重新排序处理者,灵活地组织处理链。
  2. 处理请求的对象需要根据运行时刻动态确定:职责链模式允许将请求沿着处理链进行传递,直到有一个对象处理它为止。每个处理者都有自己的处理逻辑和下一个处理者的引用,可以根据具体情况动态地确定请求由哪个对象来处理。
  3. 需要动态地组织和管理一条处理链:职责链模式可以方便地添加、删除或者重新排序处理者,灵活地组织处理链。可以根据不同的需求,动态地调整处理链的结构。
  4. 多个对象可以处理同一个请求:职责链模式可以将请求沿着处理链进行传递,直到有一个对象处理它为止。每个处理者都有机会处理请求,可以根据具体情况来决定是否处理或者传递给下一个处理者。

职责链模式在实际开发中有很多应用场景,比如有以下 4 44 点。

  1. 日志处理:多个日志处理器可以组成一个处理链,每个处理器根据日志的级别来决定是否处理或者传递给下一个处理器。
  2. 异常处理:多个异常处理器可以组成一个处理链,每个处理器根据异常的类型来决定是否处理或者传递给下一个处理器。
  3. 权限校验:多个权限校验处理器可以组成一个处理链,每个处理器根据权限的级别来决定是否处理或者传递给下一个处理器。
  4. 请求过滤:多个请求过滤器可以组成一个处理链,每个过滤器根据请求的特征来决定是否处理或者传递给下一个过滤器。

总之,职责链模式可以帮助降低系统的耦合度,提高代码的灵活性和可扩展性,在处理需求复杂、处理逻辑多样的场景中具有很好的应用价值。


四、职责链模式面试题

  1. 什么是职责链模式?它的作用是什么?
  2. 职责链模式的角色有哪些?请简要描述每个角色的作用。
  3. 职责链模式和策略模式有何区别?
  4. 如何实现一个职责链模式?请简要描述该模式的实现步骤。
  5. 职责链模式的优缺点是什么?
  6. 职责链模式适用于哪些场景?请举例说明。
  7. 在职责链模式中,如何确定请求由哪个处理者来处理?
  8. 职责链模式和装饰器模式有何异同点?
  9. 职责链模式和观察者模式有何异同点?
  10. 在职责链模式中,如何防止请求形成无限循环?
相关文章
|
9月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
1062 157
|
9月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
903 2
|
11月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
设计模式 算法 前端开发
【设计模式】【行为型模式】职责链模式(Chain of Responsibility)
一、入门 什么是职责链模式? 职责链模式是一种行为设计模式,它允许你将请求沿着一条链传递,直到有对象处理它为止。每个对象都有机会处理请求,或者将其传递给链中的下一个对象。 为什么需要职责链模式? 使用
445 16
|
9月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
2519 35
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
273 0
|
9月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
647 8
|
11月前
|
设计模式 安全 Java
Java设计模式(一):单例模式与工厂模式
本文详解单例模式与工厂模式的核心实现及应用,涵盖饿汉式、懒汉式、双重检查锁、工厂方法、抽象工厂等设计模式,并结合数据库连接池与支付系统实战案例,助你掌握设计模式精髓,提升代码专业性与可维护性。
|
11月前
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。

热门文章

最新文章