从零开始学设计模式(十九):责任链模式(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。

目录
相关文章
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
55 9
|
24天前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
36 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
本教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速上手Kotlin的读者,推荐查阅“简洁”系列教程。本文通过学生会经费申请的例子,介绍了责任链模式及其在Kotlin中的实现,并使用偏函数进行了改进,使代码更加简洁和灵活。
15 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
38 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin学习笔记 - 改良设计模式 - 责任链模式
Kotlin学习笔记 - 改良设计模式 - 责任链模式
44 0
|
3月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
3月前
|
设计模式 缓存 监控
Java设计模式-责任链模式(17)
Java设计模式-责任链模式(17)
|
2月前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
27 0
|
3月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
28天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式