从零开始学设计模式(十九):责任链模式(Chain of Responsibility Pattern)

简介: 责任链模式(Chain of Responsibility Pattern)又叫也叫职责链模式,指的是为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。它是一种对象行为型模式。

定义


责任链模式(Chain of Responsibility Pattern)又叫也叫职责链模式,指的是为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。它是一种对象行为型模式。


组成部分


责任链模式包含以下两个主要部分:


1、抽象处理类(Handler):抽象处理类中主要包含一个指向下一处理类的成员变量nextHandler和一个抽象的处理请求的方法handRequest。handRequest方法由具体的处理子类进行实现,如果满足处理的条件,则该具体的处理子类就处理这个请求,否则由nextHandler来处理,以此类推。


2、具体处理类(Concrete Handler):实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的nextHandler处理,以此类推。


例子


首先声明一个抽象的处理类:


public abstract  class Handler {
    private Handler nextHandler;
    public Handler getNextHandler() {
        return nextHandler;
    }
    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }
    //抽象的处理请求的方法
    public abstract void handleRequest(String request);
}
复制代码


再声明两个具体的处理类,继承抽象处理类并且实现抽象的处理请求方法:


public class ConcreteHandler1 extends Handler{
    @Override
    public void handleRequest(String request) {
        if (request.equals("做饭")) {
            System.out.println("肚子饿了具体处理者1开始做饭");
        } else {
            if (getNextHandler() != null) {
                getNextHandler().handleRequest(request);
            } else {
                System.out.println("没有人处理该请求!");
            }
        }
    }
}
复制代码


public class ConcreteHandler2 extends Handler{
    @Override
    public void handleRequest(String request) {
        if (request.equals("渴了")) {
            System.out.println("嘴巴渴了具体处理者2开始烧水!");
        } else {
            if (getNextHandler() != null) {
                getNextHandler().handleRequest(request);
            } else {
                System.out.println("没有人处理该请求!");
            }
        }
    }
}
复制代码


测试方法如下:


public class ChainOfResponsibilityPatternTest {
    public static void main(String[] args) {
        //责任链
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        handler1.setNextHandler(handler2);
        //请求
        handler1.handleRequest("渴了");
    }
}
复制代码


运行结果如下:

3edc76c12d054f7db951a8ae6d6bdc57~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


可以发现责任链模式其实就是对if else这类的条件语句的改版,将不同的请求的处理逻辑封装在具体的请求处理子类中。


责任链模式的优点


1、责任链模式是一种灵活版本的if else条件处理语句,它降低了对象之间的耦合度,每个具体的处理子类只需要负责处理自己的请求即可。


2、增加了拓展性,处理新的请求只需要增加具体的处理该请求的子类即可,符合了开闭原则。


3、每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,简化了对象之间的连接。


4、符合单一职责原则,每个类都有自己的明确职责方位,只需要处理自己该处理的工作,不该处理的传递给下一个对象完成。


责任链模式的缺点


1、性能较低,如果没有找到正确的处理类,那么所有的条件都需要执行,如果责任链过长,那么会导致性能较低。


2、因为没有明确的接受者,所以可能存在请求不被处理的情况,比如上面例子中的请求如果是困了,那么就没有合适的处理子类处理这个请求了。


应用场景


1、可以使用责任链模式来处理if else语句过于负责的情况。


2、如果发生了在不明确指定请求处理者的情况下,需要向多个处理者中的一个提交请求的情况,可以采用责任链模式。


总结


责任链模式指的是当有请求发生时,可将请求沿着这条责任链链传递,直到有对象处理它为止,即如果满足处理的条件,则该具体的处理子类就处理这个请求,否则由nextHandler来处理,以此类推。它的本质其实就是将请求与处理请求的逻辑进行解耦,让请求在处理链中能进行传递与被处理。


最后本文以及之前的所有的设计模式中的例子代码,都将同步至github,需要的欢迎下载star。

目录
相关文章
|
17天前
|
设计模式 Java 中间件
深入探索Java设计模式:责任链模式解析与实践
深入探索Java设计模式:责任链模式解析与实践
14 0
|
17天前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
19天前
|
设计模式 Java
Java设计模式之责任链模式详解
Java设计模式之责任链模式详解
|
2月前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
2月前
|
设计模式 安全 Java
设计模式之责任链 Chain Of Responsibility
设计模式之责任链 Chain Of Responsibility
29 1
|
1月前
|
设计模式 架构师 NoSQL
设计模式第六讲:责任链模式和迭代器模式详解
遍历任务交由迭代器完成,这简化了聚合类。  C. 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
145 0
|
2月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Chain of responsibility(责任链模式)
【设计模式】JAVA Design Patterns——Chain of responsibility(责任链模式)
|
5天前
|
设计模式 Go
Go语言设计模式:使用Option模式简化类的初始化
在Go语言中,面对构造函数参数过多导致的复杂性问题,可以采用Option模式。Option模式通过函数选项提供灵活的配置,增强了构造函数的可读性和可扩展性。以`Foo`为例,通过定义如`WithName`、`WithAge`、`WithDB`等设置器函数,调用者可以选择性地传递所需参数,避免了记忆参数顺序和类型。这种模式提升了代码的维护性和灵活性,特别是在处理多配置场景时。
41 8
|
13天前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 构造函数模式
js设计模式【详解】—— 构造函数模式
18 6
|
19天前
|
设计模式 存储 算法
设计模式学习心得之五种创建者模式(2)
设计模式学习心得之五种创建者模式(2)
15 2