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

472 阅读5分钟

这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

作者的其他平台:

| CSDN:blog.csdn.net/qq_41153943

| 掘金:juejin.cn/user/651387…

| 知乎:www.zhihu.com/people/1024…

| GitHub:github.com/JiangXia-10…

| 公众号:1024笔记

本文大概1940字,读完预计需要7分钟

定义

责任链模式(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("渴了");
    }
}

运行结果如下:

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

责任链模式的优点

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

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

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

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

责任链模式的缺点

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

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

应用场景

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

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

总结

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

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

Github地址:

github.com/JiangXia-10…

相关推荐:

从零开始学设计模式(一):什么是设计模式

从零开始学设计模式(二):单例模式

从零开始学设计模式(三):原型模式(Prototype Pattern)

从零开始学设计模式(四):工厂模式(Factory Pattern)

从零开始学设计模式(五):建造者模式(Builder Pattern)

从零开始学设计模式(六):适配器模式(Adapter Pattern)

从零开始学设计模式(六):代理模式(Proxy Pattern)

从零开始学设计模式(八):装饰器模式(Decorator Pattern)

从零开始学设计模式(九):外观模式(Facade Pattern)

从零开始学设计模式(十):桥接模式(Bridge Pattern)

从零开始学设计模式(十一):组合模式(Composite Pattern)

从零开始学设计模式(十二):享元模式(Flyweight Pattern)

从零开始学设计模式(十三):访问者模式(Visitor Pattern)

从零开始学设计模式(十四):中介者模式(Mediator Pattern)

从零开始学设计模式(十五):模版方法模式(Template Method Pattern)

从零开始学设计模式(十六):策略模式(Strategy Pattern)

从零开始学设计模式(十七):备忘录设计模式(Memento Pattern)

从零开始学设计模式(十八):状态模式(State Pattern)