深入浅出设计模式 - 责任链模式

简介: 深入浅出设计模式 - 责任链模式

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌

Java知识图谱点击链接:体系化学习Java(Java面试专题)

💕💕 感兴趣的同学可以收藏关注下不然下次找不到哟💕💕

1687927053750.jpg

1、什么是责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象按照顺序处理请求,避免请求发送者与接收者之间的耦合关系。在责任链模式中,每个处理者对象都包含对下一个处理者对象的引用,形成一个链条,当请求到达时,会依次传递给链条上的处理者进行处理,直到有一个处理者能够处理该请求或者请求到达链条的末端。

责任链模式的核心思想是将请求的发送和处理解耦,使得多个处理者都有机会处理请求,而不是由一个处理者独自承担所有责任。这样可以提高系统的灵活性和可扩展性。

2、责任链模式的优缺点

责任链模式的优点:

  1. 降低耦合度:责任链模式将请求发送者和接收者解耦,请求发送者不需要知道处理者的具体信息,只需要将请求发送给第一个处理者即可。

  2. 灵活性和可扩展性:责任链模式可以动态地增加或修改处理者,改变处理顺序,灵活地处理请求。

  3. 可以处理复杂的请求:责任链模式可以将复杂的请求拆分成多个处理者,每个处理者负责处理一部分逻辑,使得代码更加清晰和易于维护。

责任链模式的缺点:

  1. 请求未必被处理:如果没有合适的处理者,请求可能会到达链条的末端而没有被处理,这可能导致一些请求没有得到处理或者处理结果不符合预期。

  2. 对于复杂的请求,可能需要遍历整个链条:在处理复杂的请求时,可能需要遍历整个链条,性能上可能有一定的影响。

总结来说,责任链模式适用于需要多个对象按照顺序处理请求的场景,它具有降低耦合度、灵活性和可扩展性的优点,但也要注意处理者的设置和性能问题。

3、责任链模式的应用场景

责任链模式适用于以下场景:

  1. 请求的发送者不需要知道请求的具体处理者:责任链模式将请求的发送者和接收者解耦,发送者只需要将请求发送给第一个处理者,而不需要知道具体是谁来处理请求。

  2. 多个对象可以处理同一个请求:责任链模式可以将一个请求发送给多个处理者,每个处理者负责处理一部分逻辑,从而实现请求的分发和处理。

  3. 需要动态地指定处理者或处理顺序:责任链模式可以动态地增加或修改处理者,改变处理顺序,灵活地处理请求。

  4. 可以处理复杂的请求:如果一个请求涉及多个处理环节,每个处理者只负责处理一部分逻辑,责任链模式可以将复杂的请求拆分成多个简单的处理步骤,使得代码更加清晰和易于维护。

  5. 需要避免请求发送者和接收者之间的耦合关系:责任链模式可以降低请求发送者和接收者之间的耦合度,每个处理者只需要关注自己的处理逻辑,不需要了解其他处理者的存在。

责任链模式在实际开发中有很多应用,例如审批流程、日志记录、异常处理等。它可以帮助我们将复杂的业务逻辑拆分成多个简单的处理步骤,提高代码的可维护性和灵活性。

4、责任链模式的结构

责任链模式的结构包括以下几个角色:

  1. 抽象处理者(Handler):定义了处理请求的接口,通常包含一个处理方法,用于处理请求,并可以设置下一个处理者。

  2. 具体处理者(ConcreteHandler):实现了抽象处理者接口,具体处理请求的逻辑。如果自己无法处理该请求,则将请求传递给下一个处理者。

  3. 客户端(Client):创建并配置责任链,将请求发送给第一个处理者。

在责任链模式中,请求会从第一个处理者开始,如果该处理者能够处理请求,则直接处理,否则将请求传递给下一个处理者,直到找到能够处理请求的处理者为止。这样可以实现请求的分发和处理的解耦,同时也可以动态地增加或修改处理者,改变处理顺序。

责任链模式的结构简单明了,可以灵活地组织和管理处理逻辑,提高代码的可维护性和扩展性。

5、责任链模式的原理

责任链模式的原理是将多个处理者对象组成一个链条,每个处理者对象都可以处理请求,如果当前处理者无法处理请求,则将请求传递给下一个处理者,直到找到能够处理请求的处理者为止。

当一个请求到达责任链的起始点时,首先由起始点的处理者进行处理,如果处理者能够处理该请求,则进行处理并结束。如果处理者无法处理该请求,则将请求传递给下一个处理者,直到找到能够处理请求的处理者为止。

每个处理者都有一个指向下一个处理者的引用,形成了一个链条。这样,请求会依次经过每个处理者,直到找到能够处理请求的处理者为止。处理者之间的关系可以是单向的,也可以是双向的。

责任链模式的优点是能够动态地增加或修改处理者,灵活性较高。同时,责任链模式也实现了请求的发送者和接收者之间的解耦,请求发送者无需知道具体的处理者是谁,只需要将请求发送给责任链的起始点即可。

责任链模式适用于以下情况:

  1. 有多个对象可以处理同一个请求,但具体由哪个对象处理需要在运行时动态确定。

  2. 可以动态增加或修改处理者,以及动态改变处理顺序。

  3. 需要将请求发送者和接收者解耦,避免耦合度过高。

总之,责任链模式通过将多个处理者组成一个链条,实现了请求的分发和处理的解耦,提高了代码的可维护性和扩展性。

6、责任链模式的代码案例

定义请求类:

package com.pany.camp.design.principle.responsibility;

/**
 *
 * @description:  请求类
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-28 12:43
 */
public class Request {
   
   

    private String type;

    private String content;

    public Request(String type, String content) {
   
   
        this.type = type;
        this.content = content;
    }

    public String getType() {
   
   
        return type;
    }

    public String getContent() {
   
   
        return content;
    }
}

定义一个处理者接口:

package com.pany.camp.design.principle.responsibility;

/**
 *
 * @description:  处理者接口
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-28 12:42 
 */
public interface Handler {
   
   

    void setNextHandler(Handler nextHandler);

    void handleRequest(Request request);
}

然后,实现具体的处理者类:

package com.pany.camp.design.principle.responsibility;

/**
 * @description: 处理者类
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-28 12:43
 */
public class ConcreteHandler implements Handler {
   
   

    private Handler nextHandler;

    @Override
    public void setNextHandler(Handler nextHandler) {
   
   
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(Request request) {
   
   
        if (request.getType().equals("Type1")) {
   
   
            System.out.println("ConcreteHandler1处理了请求:" + request.getContent());
        } else if (nextHandler != null) {
   
   
            nextHandler.handleRequest(request);
        } else {
   
   
            System.out.println("无法处理该请求:" + request.getContent());
        }
    }
}
package com.pany.camp.design.principle.responsibility;

/**
 *
 * @description:  处理者类
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-28 12:44
 */
public class ConcreteHandler2 implements Handler {
   
   

    private Handler nextHandler;

    @Override
    public void setNextHandler(Handler nextHandler) {
   
   
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(Request request) {
   
   
        if (request.getType().equals("Type2")) {
   
   
            System.out.println("ConcreteHandler2处理了请求:" + request.getContent());
        } else if (nextHandler != null) {
   
   
            nextHandler.handleRequest(request);
        } else {
   
   
            System.out.println("无法处理该请求:" + request.getContent());
        }
    }
}

使用责任链模式:

package com.pany.camp.design.principle.responsibility;

/**
 *
 * @description: 客户端
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-28 12:44
 */
public class Client {
   
   

    public static void main(String[] args) {
   
   
        // 创建具体的处理者对象
        Handler handler1 = new ConcreteHandler();
        Handler handler2 = new ConcreteHandler2();
        // 设置处理者之间的关系
        handler1.setNextHandler(handler2);
        // 创建请求
        Request request1 = new Request("Type1", "请求1");
        Request request2 = new Request("Type2", "请求2");
        Request request3 = new Request("Type3", "请求3");
        // 处理请求
        handler1.handleRequest(request1);
        handler1.handleRequest(request2);
        handler1.handleRequest(request3);
    }
}

具体的处理者对象分别是 ConcreteHandler1 和 ConcreteHandler2 ,它们分别处理了不同类型的请求。如果一个处理者无法处理请求,则将请求传递给下一个处理者,直到找到能够处理请求的处理者为止。

输出结果如下:

ConcreteHandler1处理了请求:请求1
ConcreteHandler2处理了请求:请求2
无法处理该请求:请求3

Process finished with exit code 0

1686494501743.jpg

💕💕 本文由激流丶创作
💕💕喜欢的话记得点赞收藏啊

1687869804912.jpg

目录
相关文章
|
7月前
|
设计模式 Java
【设计模式系列笔记】责任链模式
责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理它。每个处理者都有一个对下一个处理者的引用。责任链模式常用于处理请求的场景,例如在一个请求需要经过多个步骤或者多个对象来处理的情况下。
83 0
|
7月前
|
设计模式 Java
【设计模式】责任链模式
【设计模式】责任链模式
|
7月前
|
设计模式
【设计模式】责任链模式
【1月更文挑战第27天】【设计模式】责任链模式
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
55 9
|
1月前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
37 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
本教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速上手Kotlin的读者,推荐查阅“简洁”系列教程。本文通过学生会经费申请的例子,介绍了责任链模式及其在Kotlin中的实现,并使用偏函数进行了改进,使代码更加简洁和灵活。
16 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
39 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin学习笔记 - 改良设计模式 - 责任链模式
Kotlin学习笔记 - 改良设计模式 - 责任链模式
44 0
|
3月前
|
设计模式 缓存 监控
Java设计模式-责任链模式(17)
Java设计模式-责任链模式(17)
|
2月前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
27 0