【Java 设计模式】行为型之责任链模式

news/2024/5/19 12:55:41 标签: java, 设计模式, 责任链模式

文章目录

    • 1. 定义
    • 2. 应用场景
    • 3. 代码实现
    • 结语

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,用于将请求发送者和接收者解耦,使得多个对象都有机会处理请求。责任链模式通过创建一个处理请求的链,将请求沿着链传递,直到有一个对象能够处理为止。在本文中,我们将深入研究Java中责任链模式的定义、结构、使用场景以及如何在实际开发中应用。

1. 定义

责任链模式是一种行为型设计模式,用于将请求发送者和接收者解耦,使得多个对象都有机会处理请求。责任链模式通过创建一个处理请求的链,将请求沿着链传递,直到有一个对象能够处理为止。责任链模式通常包含两个主要角色:抽象处理者(Abstract Handler)和具体处理者(Concrete Handler)。

  • 抽象处理者(Abstract Handler): 定义了一个处理请求的接口,可以包含一个指向下一处理者的引用
  • 具体处理者(Concrete Handler): 实现了抽象处理者的接口,负责处理请求,同时可以决定是否将请求传递给下一处理者

2. 应用场景

责任链模式通常在以下场景中使用:

  • 多个对象可以处理同一请求:

    当有多个对象可以处理同一请求,但具体哪个对象处理由运行时确定时,可以使用责任链模式

  • 动态决定处理者:

    当需要动态地决定请求的处理者,而不是在编译时确定时,可以使用责任链模式

  • 避免发送者和接收者之间的耦合关系:

    当需要避免发送者和接收者之间的耦合关系,使得系统更加灵活时,可以使用责任链模式

3. 代码实现

下面通过一个简单的例子来演示责任链模式的实现。假设有一个请假系统,根据不同的请假天数,不同级别的领导进行审批。

抽象处理者 - 领导 Leader

java">package com.cheney.demo;

abstract class Leader {
    private Leader nextLeader;

    public Leader getNextLeader() {
        return nextLeader;
    }

    public void setNextLeader(Leader nextLeader) {
        this.nextLeader = nextLeader;
    }

    // 处理请假请求的方法
    public abstract void handleRequest(int days);
}

具体处理者 - 主管 Supervisor

java">package com.cheney.demo;

class Supervisor extends Leader {
    @Override
    public void handleRequest(int days) {
        if (days <= 2) {
            System.out.println("主管批准休假 " + days + " 天");
        } else if (getNextLeader() != null) {
            getNextLeader().handleRequest(days);
        }
    }
}

具体处理者 - 经理 Manager

java">package com.cheney.demo;

class Manager extends Leader {
    @Override
    public void handleRequest(int days) {
        if (days <= 5) {
            System.out.println("经理批准休假 " + days + " 天");
        } else if (getNextLeader() != null) {
            getNextLeader().handleRequest(days);
        }
    }
}

具体处理者 - 总经理 GeneralManager

java">package com.cheney.demo;

class GeneralManager extends Leader {
    @Override
    public void handleRequest(int days) {
        if (days <= 10) {
            System.out.println("总经理批准休假 " + days + " 天");
        } else {
            System.out.println("休假申请被拒绝 " + days + " 天");
        }
    }
}

客户端启动类 Main

java">package com.cheney.demo;

public class Main {
    public static void main(String[] args) {
        // 使用责任链模式处理请假请求
        Leader supervisor = new Supervisor();
        Leader manager = new Manager();
        Leader generalManager = new GeneralManager();

        supervisor.setNextLeader(manager);
        manager.setNextLeader(generalManager);

        // 主管批准休假 3 天
        supervisor.handleRequest(3);
        // 经理批准休假 7 天
        supervisor.handleRequest(7);
        // 休假申请被拒绝 12 天
        supervisor.handleRequest(12);
    }
}

在上述例子中,Leader 是抽象处理者,定义了处理请假请求的接口,并包含一个指向下一处理者的引用。SupervisorManagerGeneralManager 是具体处理者,实现了抽象处理者的接口,负责处理请假请求,并根据请假天数决定是否将请求传递给下一处理者。

在客户端中,我们使用责任链模式处理请假请求。通过设置处理者之间的关系,请求会沿着责任链传递,直到有一个处理者能够处理为止。

结语

责任链模式是一种用于将请求发送者和接收者解耦的设计模式。通过创建一个处理请求的链,将请求沿着链传递,直到有一个对象能够处理为止,实现了请求的动态处理。在实际开发中,责任链模式常被用于处理复杂的请求逻辑、审批流程等场景。通过合理使用责任链模式,可以使系统更加灵活和可扩展。


http://www.niftyadmin.cn/n/5342958.html

相关文章

一站式VR全景婚礼的优势表现在哪里?

你是否想过&#xff0c;婚礼也可以用一种全新的方式呈现&#xff0c;VR全景婚礼让每位用户沉浸式体验婚礼现场感。现在很多年轻人&#xff0c;都想让自己的婚礼与众不同&#xff0c;而VR全景婚礼也是未来发展的方向之一。 很多婚庆公司开通了VR婚礼这一服务&#xff0c;就是通过…

qt学习:QListWidget控件+自定义条目项+双击删除+单击获取

目录 图片 头函数 接口 显示案例 方法1 方法2 方法3

网络防御保护——1.网络安全概述

一.网络安全概念 通信保密阶段 --- 计算机安全阶段 --- 信息系统安全 --- 网络空间安全 APT攻击 --- 高级持续性威胁 网络安全(网络空间安全--Cyberspace)从其本质上讲就是网络上的信息安全&#xff0c;指网络系统的硬件、软件及数据受到保护。不遭受破坏、更改、泄露&#xf…

卸载 MariaDB:

如果你想将 MariaDB 5.5.68 替换为 MySQL 8&#xff0c;请按照以下步骤操作。在执行这些步骤之前&#xff0c;请确保你已经备份了所有重要的数据库和数据&#xff0c;以防发生意外情况。 1. 卸载 MariaDB&#xff1a; 使用适合你系统的包管理器卸载 MariaDB。在 CentOS/RHEL …

web安全学习笔记【05】——反弹Shell、正反向连接

思维导图 #知识点&#xff1a; 1、Web常规-系统&中间件&数据库&源码等 2、Web其他-前后端&软件&Docker&分配站等 3、Web拓展-CDN&WAF&OSS&反向&负载均衡等 ----------------------------------- 1、APP架构-封装&原生态&H5&am…

iPerf3 使用指南

文章目录 iPerf3 使用指南1 iPerf3 简介2 安装指令2.1 Windows2.2 Linux 3 入门用法4 进阶用法4.1 启动服务端4.2 TCP 带宽测试4.3 UDP 带宽测试 5 iPerf3 命令说明 iPerf3 使用指南 1 iPerf3 简介 iPerf3 是用于主动测试 IP 网络上最大可用带宽的工具。它支持时序、缓冲区、…

OpenHarmony 鸿蒙使用指南——概述

简介 OpenHarmony采用多内核&#xff08;Linux内核或者LiteOS&#xff09;设计&#xff0c;支持系统在不同资源容量的设备部署。当相同的硬件部署不同内核时&#xff0c;如何能够让设备驱动程序在不同内核间平滑迁移&#xff0c;消除驱动代码移植适配和维护的负担&#xff0c;…

Leetcode—51.N皇后【困难】

2023每日刷题&#xff08;八十四&#xff09; Leetcode—51.N皇后 算法思想 实现代码 class Solution { public:vector<vector<string>> solveNQueens(int n) {vector<int> col(n), on_path(n), diag1(2*n), diag2(2*n);vector<vector<string>>…