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

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;
    }
}
相关推荐
z落落5 分钟前
C# 静态成员 vs 非静态成员(调用规则+内存特点)+只读和常量 const常量 / readonly / static readonly 三者终极区别
java·开发语言·c#
java1234_小锋11 分钟前
LangChain4j 开发Java Agent智能体- 整合SpringBoot4
java·开发语言·langchain4j
basketball61614 分钟前
C++进阶:3. unique_ptr 现代C++内存管理的基石
java·jvm·c++
zzqssliu20 分钟前
跨境代购系统的物流和通知模块重构思考:从设计模式到生产落地
java·设计模式·重构
appearappear23 分钟前
一句sql 根据明细数据状态,精确更新一个主单主状态
java
许彰午26 分钟前
04_Java数组操作全解
java·开发语言·python
AIGS00127 分钟前
生产运营三大瓶颈,工业AI怎么破局?
java·人工智能·人工智能ai大模型应用
码不停蹄的玄黓27 分钟前
Java 线程池 execute() 和 submit() 对比
java·开发语言
方也_arkling34 分钟前
【Java-Day19】集合1(Collect单列集合)
java·开发语言
方也_arkling1 小时前
【Java-Day19】集合3 List中常见的方法和5种遍历方式
java·开发语言