【设计模式】责任连模式怎么用?

我将通过一个贴近现实的故事------请假审批流程,带你了解和掌握责任链模式

什么是责任链模式?

责任链模式是一种行为设计模式,它让你可以避免将请求的发送者与接收者耦合在一起,让多个对象都有处理请求的机会将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止

责任链模式的使用场景是什么?

当你希望在一个对象链上按顺序发送请求,让其中任何一个对象都有机会处理这个请求时,就可以使用责任链模式。这样,发送者会与一个或多个对象进行解耦合

如何在实际中使用责任链模式?

让我们看看如何在"请假审批"这个场景中使用责任链模式。首先,我们为所有审批人创建一个通用的接口:

java 复制代码
public interface Approver {
    void setNextApprover(Approver nextApprover);
    void handleRequest(LeaveRequest request);
}

然后,我们为需要处理的请求定义一个类:

java 复制代码
public class LeaveRequest {
    private int leaveDays;
    // 基础信息如姓名、部门等

    public LeaveRequest(int leaveDays) {
        this.leaveDays = leaveDays;
    }

    public int getLeaveDays() {
        return leaveDays;
    }
}

接着,我们分别实现各级审批人,例如,直接主管:

java 复制代码
public class Supervisor implements Approver {
    private Approver nextApprover;

    @Override
    public void setNextApprover(Approver nextApprover) {
        this.nextApprover = nextApprover;
    }

    @Override
    public void handleRequest(LeaveRequest request) {
        if (request.getLeaveDays() <= 3) {
            // 批准请求
        } else {
            // 转交给更高级别的主管
            if (nextApprover != null) {
                nextApprover.handleRequest(request);
            }
        }
    }
}

// 你可以创建更多的审批人,例如经理,HR等,它们的实现方式与主管类似。

接下来,我们可以构建一个完整的责任链:

java 复制代码
Approver supervisor = new Supervisor();
Approver manager = new Manager();
Approver hr = new HR();

// 设置责任链
supervisor.setNextApprover(manager);
manager.setNextApprover(hr);

// 创建一个请假请求
LeaveRequest request = new LeaveRequest(5);
// 发送请求
supervisor.handleRequest(request);

在这个例子中,由于请假天数超过了主管的审批权限(3天),所以主管将请求传递给了经理;如果经理也无法处理,它将再传递给HR。这样,责任链模式使我们可以简单地添加或者删除审批级别,并且使审批过程清晰透明

总结,责任链模式对于管理一个分层次的请求处理机制非常有用,它降低了请求的发送者和接收者之间的耦合度,增强了系统的扩展性。

相关推荐
软件黑马王子3 分钟前
Unity游戏制作中的C#基础(6)方法和类的知识点深度剖析
开发语言·游戏·unity·c#
Logintern0913 分钟前
使用VS Code进行Python编程的一些快捷方式
开发语言·python
Multiple-ji24 分钟前
想学python进来看看把
开发语言·python
极客先躯28 分钟前
说说高级java每日一道面试题-2025年2月13日-数据库篇-请说说 MySQL 数据库的锁 ?
java·数据库·mysql·数据库的锁·模式分·粒度分·属性分
程序员侠客行30 分钟前
Spring事务原理 二
java·后端·spring
一个小白11 小时前
C++——list模拟实现
开发语言·c++
bug总结1 小时前
新学一个JavaScript 的 classList API
开发语言·javascript·ecmascript
小猫猫猫◍˃ᵕ˂◍1 小时前
备忘录模式:快速恢复原始数据
android·java·备忘录模式
Nicole Potter1 小时前
请说明C#中的List是如何扩容的?
开发语言·面试·c#
liuyuzhongcc1 小时前
List 接口中的 sort 和 forEach 方法
java·数据结构·python·list