设计模式20——职责链模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

职责链模式(Chain of Responsibility)

是一种行为型模式。

目录

一、概述

1.1、直观的理解:

1.2、主要角色:

1.3、描述对象之间关系的UML图:

1.4、适用场景:

二、简单举例

2.1、对象之间的关系用UML图表示如下:

2.2、Java代码如下:


一、概述

复制代码
1、使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
复制代码
2、职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接收者的引用。
复制代码
3、可以随时增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。

1.1、直观的理解

假设有三个处理请求者,它们组成一个处理链1-》2-》3:

当遇到请求后的处理步骤如下:

可以看到,如果前面的处理请求者能开处理此次请求,那么就不会再把请求传递到后面。这很像if-else语句。

1.2、主要角色:

  • 处理请求者:++处理请求的抽象类或接口++ + ++处理请求类++
  • ++发起请求者++

(注:请求链要按需填装配置以后才可以正常使用)

1.3、描述对象之间关系的UML图:

1.4、适用场景:

  • 有多个对象可以处理一个请求,并且具体是哪个对象处理是在运行时自动确定
  • 你想在不明确指定哪个接收者时,向多个对象中的一个提交一个请求
  • 可处理一个请求的对象集合应该被动态指定

二、简单举例

现在有三个处理请求者A、B、C,它们分别能够处理的请求参数的范围为:0到9、10到19、20到29。以处理者请求A为头将他们按顺序串在一起,然后请求发起者给处理者请求A发送4个请求。例子简单就不再详细分析了。你可以把这当做一个模板,然后灵活使用:

2.1、对象之间的关系用UML图表示如下:

2.2、Java代码如下:

处理请求者的抽象类:

java 复制代码
abstract class Handler {
    protected Handler successor;

    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

    public abstract void handleRequest(int request);
}

处理请求类A:

java 复制代码
public class ConcreteHandlerA extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 0 && request < 10) {
            System.out.println(this.getClass().getSimpleName() + "处理请求" + request);
        } else if (this.successor != null) {
            this.successor.handleRequest(request);
        }
    }
}

处理请求类B:

java 复制代码
public class ConcreteHandlerB extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 10 && request < 20) {
            System.out.println(this.getClass().getSimpleName() + "处理请求" + request);
        } else if (this.successor != null) {
            this.successor.handleRequest(request);
        }
    }
}

处理请求类C:

java 复制代码
public class ConcreteHandlerC extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 20 && request < 30) {
            System.out.println(this.getClass().getSimpleName() + "处理请求" + request);
        } else if (this.successor != null) {
            this.successor.handleRequest(request);
        }
    }
}

主程序(发起请求的类):

java 复制代码
public class Main {
    public static void main(String[] args) {
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        Handler handlerC = new ConcreteHandlerC();
        //串联ABC
        handlerA.setSuccessor(handlerB);
        handlerB.setSuccessor(handlerC);

        //发送请求
        int[] requests = {1, 14, 25, 36};
        for (int request : requests) {
            handlerA.handleRequest(request);
        }
    }
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!

相关推荐
wrx繁星点点1 小时前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
金池尽干2 小时前
设计模式之——观察者模式
观察者模式·设计模式
也无晴也无风雨3 小时前
代码中的设计模式-策略模式
设计模式·bash·策略模式
捕鲸叉12 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
wrx繁星点点12 小时前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
凉辰12 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
菜菜-plus12 小时前
java设计模式之策略模式
java·设计模式·策略模式
暗黑起源喵12 小时前
设计模式-迭代器
设计模式
lexusv8ls600h14 小时前
微服务设计模式 - 网关路由模式(Gateway Routing Pattern)
spring boot·微服务·设计模式
sniper_fandc17 小时前
抽象工厂模式
java·设计模式·抽象工厂模式