设计模式代码实战-责任链模式

1、问题描述

小明所在的公司请假需要在OA系统上发布申请,整个请求流程包括多个处理者,每个处理者负责处理不同范围的请假天数,如果一个处理者不能处理请求,就会将请求传递给下一个处理者,请你实现责任链模式,可以根据请求天数找到对应的处理者。

审批责任链由主管(Supervisor), 经理(Manager)和董事(Director)组成,他们分别能够处理3天、7天和10天的请假天数。如果超过10天,则进行否决。

输入示例

4

Alice 2

Bob 5

Tom 10

Jerry 12

输出示例

Alice Approved by Supervisor.

Bob Approved by Manager.

Tom Approved by Director.

Jerry Denied by Director.

2、责任链模式

其实就是单链表数据结构,一个个递归向后处理,当前节点能处理就返回

3、代码

java 复制代码
import com.sun.java.accessibility.util.TopLevelWindowListener;

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        Supervisor s=new Supervisor();

        Manager m=new Manager();

        Director d=new Director();

        s.setNext(m);
        m.setNext(d);
        int number=Integer.parseInt(sc.nextLine());
        for(int i=0;i<number;i++){
            String input=sc.nextLine();
            String[] ss=input.split(" ");
            String username=ss[0];
            int day=Integer.parseInt(ss[1]);
            s.handleRequest(username,day);
        }



    }
}

interface Handler{
    void setNext(Handler next);
    Handler getNext();
    void handleRequest(String username,int time);
    boolean canHandleRequest(int time);
}

class Supervisor implements Handler{
    private  Handler next;
    @Override
    public void setNext(Handler next) {
        this.next=next;
    }

    @Override
    public Handler getNext() {
        return this.next;
    }

    @Override
    public void handleRequest(String username,int time) {
        if(canHandleRequest(time)){
            System.out.println(username+" Approved by Supervisor.");
        }else {
            Handler next=getNext();
            next.handleRequest(username,time);
        }
    }

    @Override
    public boolean canHandleRequest(int time) {
        if(time>3){
            return false;
        }
        return true;
    }
}

class Manager implements Handler{
    private  Handler next;
    @Override
    public void setNext(Handler next) {
        this.next=next;
    }

    @Override
    public Handler getNext() {
        return this.next;
    }

    @Override
    public void handleRequest(String username, int time) {
        if(canHandleRequest(time)){
            System.out.println(username+" Approved by Manager.");
        }else {
            Handler next=getNext();
            next.handleRequest(username,time);
        }
    }

    @Override
    public boolean canHandleRequest(int time) {
        if(time>5){
            return false;
        }
        return true;
    }
}


class Director implements Handler{
    private  Handler next;
    @Override
    public void setNext(Handler next) {
        this.next=next;
    }

    @Override
    public Handler getNext() {
        return this.next;
    }

    @Override
    public void handleRequest(String username, int time) {
        if(canHandleRequest(time)){
            System.out.println(username+" Approved by Director.");
        }else {
            System.out.println(username+" Denied by Director.");
        }
    }

    @Override
    public boolean canHandleRequest(int time) {
        if(time>10){
            return false;
        }
        return true;
    }
}
相关推荐
SL_staff6 分钟前
周报越厚问题越拖?用结构化执行机制让周报回归决策价值
java·spring cloud·开源
梅梅绵绵冰13 分钟前
JVM虚拟机
java·开发语言·jvm
golang学习记16 分钟前
Python vs Go:2026年到底该怎么选
java·vscode·python·golang·pycharm·goland
Shaoshing41 分钟前
消息顺序
java·开发语言
我命由我123451 小时前
SQL 检测脚本
java·数据库·sql·功能测试·单元测试·压力测试·可用性测试
Hpc_Fun1 小时前
GPU 工作站品牌怎么比?五把可核验尺子、加权评分脚本与场景重排
java·信创·gpu工作站·品牌对比·加权评分
const_qiu1 小时前
第四章 03:4.3 Tools —— 让 Agent 会用工具
java·人工智能
Rain的Java大神之路1 小时前
百万并发直播弹幕系统设计全解:看懂了扇出,你就看懂了高并发的八成
java·后端·面试
\光辉岁月/2 小时前
2.异常类
java·开发语言·异常类
代钦塔拉2 小时前
【C++/Qt 进阶】设计模式系列(6):桥接模式——把“两个独立变化的维度“拆开
c++·qt·设计模式