大数据知识体系
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
  • 设计模式概述
  • 创建型模式

    • 单例模式
    • 简单工厂模式
    • 工厂方法模式
    • 抽象工厂模式
    • 建造者模式
    • 原型模式
  • 结构型模式

    • 适配器模式
    • 装饰器模式
    • 代理模式
    • 外观模式
    • 桥接模式
    • 组合模式
    • 享元模式
  • 行为型模式

    • 策略模式
    • 模板方法模式
    • 观察者模式
    • 迭代器模式
    • 责任链模式
      • 一、概述
        • 1.1 解决了什么问题
        • 1.2 解决方案
      • 二、实现方式
        • 2.1 角色
        • 2.2 代码
      • 三、源码中的应用
    • 命令模式
    • 备忘录模式
    • 状态模式
    • 访问者模式
    • 中介者模式
    • 解释器模式
  • 设计模式
  • 行为型模式
Will
2022-03-29
目录

责任链模式

# 一、概述

责任链(Chain Of Responsibility)模式允许将请求沿着处理链进行发送,处理链上有多个处理器,收到请求的每个处理器可对请求进行处理,或将请求传递给下个处理器。

# 1.1 解决了什么问题

责任链模式的场景很多,比如小李家里有事准备请 7 天假,但是他部门领导只有 1 天的权限,超过 1 天需要其中心领导审批,但是中心领导只有 3 天的权限,超过 3 天需要大 BOSS 审批。小李是请求的发送者,部门经理、中心领导和大 BOSS 都是这条责任链上的处理器,他们每个人都可以处理并终止这个请求或将其转交给下一个处理器,直到该请求被处理。

# 1.2 解决方案

声明一个处理器接口,该接口有两个方法,一个方法为处理当前请求,另一个方法为设置下一个处理器。每个责任链上的处理器都实现该接口。

# 二、实现方式

# 2.1 角色

  1. Handler:处理器接口,包含两个方法:处理当前请求和设置下一个处理器。
  2. Concrete Handler:具体处理器,实现了 Handler 中的接口。
  3. Client:根据程序逻辑一次性或动态生成责任链。

# 2.2 代码

定义 Handler:

public interface Handler {
    void setNextHanlder(Handler hanlder);

    boolean handle(int days);
}
1
2
3
4
5

定义各个 Concrete Handler:

public class GroupLeader implements Handler {

    private Handler nextHandler;

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

    @Override
    public boolean handle(int days) {
        if (days == 1){
            System.out.println("小组领导可以批");
            return true;
        } else {
            System.out.println("小组领导没权限,往上传递");
            return this.nextHandler.handle(days);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class CenterLeader implements Handler {

    private Handler nextHandler;

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

    @Override
    public boolean handle(int days) {
        if (days <= 3) {
            System.out.println("中心领导批了");
            return true;
        } else {
            System.out.println("中心领导没权限,往上传递");
            return this.nextHandler.handle(days);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Boss implements Handler {

    private Handler nextHandler;

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

    @Override
    public boolean handle(int days) {
        if (days <= 7) {
            System.out.println("Boss批了");
            return true;
        } else {
            System.out.println("不批,滚");
            return false;
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

定义责任链:

public class HandlerChain {

    private Handler head;

    /**
     * 设置责任链上的处理器
     *
     * @return
     */
    public void setChain(Handler first, Handler... handlers) {
        head = first;

        for (Handler nextHandler : handlers) {
            first.setNextHanlder(nextHandler);
            first = nextHandler;
        }
    }

    public void handle(int days) {
        head.handle(days);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

客户端:

public class ResponsibilityTest {
    public static void main(String[] args) {
        HandlerChain chain = new HandlerChain();
        chain.setChain(new GroupLeader(), new CenterLeader(), new Boss());

        chain.handle(1);
        System.out.println("-------------");
        chain.handle(3);
        System.out.println("-------------");
        chain.handle(5);
        System.out.println("-------------");
        chain.handle(10);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
小组领导可以批
-------------
小组领导没权限,往上传递
中心领导批了
-------------
小组领导没权限,往上传递
中心领导没权限,往上传递
Boss批了
-------------
小组领导没权限,往上传递
中心领导没权限,往上传递
不批,滚
1
2
3
4
5
6
7
8
9
10
11
12

# 三、源码中的应用

java.util.logging.Logger#log()

上次更新: 2023/11/01, 03:11:44

← 迭代器模式 命令模式→

Theme by Vdoing | Copyright © 2022-2023 Will 蜀ICP备2022002285号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式