笨蛋学设计模式行为型模式-责任链模式【18】

这篇具有很好参考价值的文章主要介绍了笨蛋学设计模式行为型模式-责任链模式【18】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

8.5责任链模式⬆️⬆️⬆️

8.5.1概念

​ 责任链模式定义了一系列的处理器对象,每个处理器对象都包含对链表中下一个处理器对象的引用。在这条请求链条中,每当一个请求发生时,它就会被传递给链表的下一个处理器对象,直到某个处理器对象处理该请求为止。

8.5.2场景

​ 在我们公司内部审批流程中,若某个员工提交了请假申请,需要经过上级的一系列的审批过程,例如小组长审批、部门经理审批、人事部审批、总经理审批等。这些审批过程可以采用责任链模式来实现,将每个审批者看作一个处理器,若某个处理者无法处理该申请,则将该申请传递给下一个处理者,直到有一个处理者同意或拒绝该申请为止。

8.5.3优势 / 劣势

  • 降低耦合度:请求发送者和接收者之间不直接交互,而是通过责任链上的多个对象进行交互,从而降低了它们之间的耦合度
  • 增强灵活性:可以动态地增加或删除处理器,从而改变请求的处理顺序和方式
  • 提高可扩展性:因为每个处理器都只负责处理自己能够处理的请求,所以可以方便地添加新的处理器来处理新的请求类型

  • 请求未处理:若没有任何一个处理器能够处理该请求,则该请求将被忽略
  • 系统性能降低:由于责任链中可能包含大量的处理器,因此可能会影响系统的性能

8.5.4责任链模式可分为

  • 处理者Handler:定义一个处理请求的接口,包含一个处理请求的抽象方法和指向下一个处理者的链接
  • 具体处理者ConcreteHandler:实现处理请求的方法,并判断能否处理请求,若能够处理请求则进行处理,否则将请求传递给下一个处理者
  • 客户端:创建并组装处理者对象链,并将请求发送到链上的第一个处理者

8.5.5责任链模式

package com.technologystatck.designpattern.mode.chainofresponsibility;


public class ChainOfResponsibility {
    public static void main(String[] args) {
        //创建处理者实例
        ConcreteHandler handlerA = new ConcreteHandler();
        ConcreteHandler handlerB = new ConcreteHandler();
        //...可以继续创建其他处理者实例

        //构建责任链
        handlerA.setNextHandler(handlerB);
        //...可以继续构建责任链

        //发送请求
        Request request = new Request(/*请求参数*/);
        handlerA.handleRequest(request);

    }
}

//1.处理者:定义处理请求的接口
interface Handler{
    //处理请求的方法
    void handleRequest(Request request);
    //设置下一个处理者的方法
    void setNextHandler(Handler nextHandler);
}

//2.具体处理者:实现处理请求
class ConcreteHandler implements Handler{
    private Handler nextHandler;

    //具体处理者自己的判断条件
    private boolean canHandle(Request request){
        //根据具体情况判断是否能够处理请求
        /**
         * 放入自己的判断条件
         */
        return true;
    }
    @Override
    public void handleRequest(Request request) {
        //根据具体情况处理请求,若无法处理则转发给下一个处理者
        if(canHandle(request)){
            //处理请求的逻辑
        }else if(nextHandler !=null){
            nextHandler.handleRequest(request);
        }else{
            //无法处理请求的逻辑,如打印日志等等
        }
    }

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

8.5.6实战

8.5.6.1题目描述

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

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

8.5.6.2输入描述

第一行是一个整数N(1 <= N <= 100), 表示请求申请的数量。

接下来的N行,每行包括一个请求申请的信息,格式为"姓名 请假天数"

8.5.6.3输出描述

对于每个请假请求,输出一行,表示该请求是否被批准。如果被批准/否决,输出被哪一个职级的人批准/否决。文章来源地址https://www.toymoban.com/news/detail-818469.html

8.5.6.4代码
package com.technologystatck.designpattern.mode.chainofresponsibility;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int nums=scanner.nextInt();
        scanner.nextLine();

        //组织责任链
        LeaveHandler director = new Director();
        LeaveHandler manager = new Manager(director);
        LeaveHandler supervisor = new Supervisor(manager);

        for(int i=0;i<nums;i++){
            String[] input = scanner.nextLine().split(" ");

            if(input.length==2){
                String name=input[0];
                int days=Integer.parseInt(input[1]);
                LeaveRequest request = new LeaveRequest(name, days);
                supervisor.handleRequest(request);
            }else{
                System.out.println("Invalid input");
                return;
            }
        }
    }
}

//请求类
class LeaveRequest{
    private String name;
    private int days;

    public LeaveRequest(String name, int days) {
        this.name = name;
        this.days = days;
    }

    public String getName() {
        return name;
    }

    public int getDays() {
        return days;
    }
}
//处理者:定义接口
interface LeaveHandler{
    void handleRequest(LeaveRequest request);
}

//具体处理者:可以有多个,负责具体处理,主要分为Supervisor、Manager、Director
//主管类
class Supervisor implements LeaveHandler{

    //最多3天请假审批
    private static final int MAX_DAYS_SUPERVISOR_CAN_APPROVE=3;
    //设置下一个处理器对象
    private LeaveHandler nextHandler;

    public Supervisor(LeaveHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(LeaveRequest request) {
        //若请假的天数小于当前处理者所能审批的最大天数,则直接审批通过,否则继续传递给下一个处理者。
        if(request.getDays()<=MAX_DAYS_SUPERVISOR_CAN_APPROVE){
            System.out.println(request.getName()+" Approved by Supervisor.");
        }else if(nextHandler !=null){
            //若下一个处理器不为空,就直接传给下一个处理器
            nextHandler.handleRequest(request);
        }else{
            System.out.println(request.getName()+"Denied by Supervisor.");
        }
    }
}
//经理类
class Manager implements LeaveHandler{
    //最多7天请假审批
    private static final int MAX_DAYS_SUPERVISOR_CAN_APPROVE=7;
    //设置下一个处理器对象
    private LeaveHandler nextHandler;

    public Manager(LeaveHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(LeaveRequest request) {
        if(request.getDays()<=MAX_DAYS_SUPERVISOR_CAN_APPROVE){
            System.out.println(request.getName()+" Approved by Manager.");
        }else if(nextHandler !=null){
            nextHandler.handleRequest(request);
        }else{
            System.out.println(request.getName()+" Denied by Manager.");
        }
    }
}

//总监类
class Director implements LeaveHandler{
    private static final int MAX_DAYS_SUPERVISOR_CAN_APPROVE=10;

    @Override
    public void handleRequest(LeaveRequest request) {
        if(request.getDays()<=MAX_DAYS_SUPERVISOR_CAN_APPROVE){
            System.out.println(request.getName()+" Approved by Director.");
        }else{
            System.out.println(request.getName()+" Denied by Director.");
        }
    }
}

8.5.7总结

  • 优点:每个处理者只负责处理与自己相关的请求,客户端不需要具体时哪个处理者处理请求
  • 总结:类似过滤器中的链式处理,一个请求不断地在链式中传入下一个处理者,直到有一个处理者能处理该请求
  • 场景:适用于一个请求会被多个处理者进行处理,并且整条责任链模式中会有合适的处理者来处理请求

到了这里,关于笨蛋学设计模式行为型模式-责任链模式【18】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 笨蛋学设计模式行为型模式-命令模式【19】

    8.6.1概念 ​ 命令模式允许将请求封装成一个对象(命令对象,包含执行操作所需地所有信息),并将命令对象按照一定的顺序存储在队列中,然后再逐一调用执行,这些命令可以支持反向操作,进行撤销和重做。这样发送者就只需要触发命令就可以完成操作,不需要知道接受者

    2024年01月23日
    浏览(39)
  • 笨蛋学设计模式行为型模式-观察者模式【14】

    8.1.1概念 ​ 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生变化时,会通知所有依赖它的观察者对象,使它们都能够得到通知并且被自动更新 8.1.2场景 ​ 在我们生活中,用户可以在音乐播放平台关注多个歌手,而

    2024年01月24日
    浏览(70)
  • 笨蛋学设计模式行为型模式-中介者模式【24】

    8.11.1概念 ​ 中介者模式通过引入一个中介者对象来封装一组对象之间的交互,从而可以使这些对象不需要直接相互引用,也就是将系统内多个对象之间的复杂关系转化为多个对象与中介者之间的简单关系。 8.11.2场景 ​ 在生活中,可以看到不少网红在直播卖货,也可以看出

    2024年01月23日
    浏览(36)
  • 笨蛋学设计模式行为型模式-备忘录模式【22】

    8.9.1概念 ​ 备忘录模式允许在不暴露对象实现细节的情况下捕获和恢复对象的内部状态。通过将对象的状态封装在备忘录对象中,并将备忘录对象保存在一个管理者对象中,可以在需要时回滚到对象之前的状态。 8.9.2场景 ​ 在现代办公场景中,备忘录模式可以应用于文档编

    2024年01月25日
    浏览(40)
  • 笨蛋学设计模式行为型模式-访问者模式【21】

    8.8.1概念 ​ 访问者模式是一种将操作逻辑与对象结构分离的方法,使得操作可以独立变化,操作逻辑被封装在独立的访问者类中,并在被访问的元素类中提供接受访问者的方法,而不是直接嵌入到数据结构中的对象中。 8.8.2场景 ​ 我们可以将一个购物商场中的商品类作为元

    2024年01月23日
    浏览(52)
  • 行为型设计模式——责任链模式

    在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就

    2024年01月16日
    浏览(45)
  • 设计模式行为型——责任链模式

    目录 什么是责任链模式 责任链模式的实现 责任链模式角色 责任链模式类图 责任链模式举例 责任链模式代码实现 责任链模式的特点 优点 缺点 使用场景 注意事项 实际应用         责任链模式(Chain of Responsibility Pattern)又叫职责链模式 , 是一种行为型设计模式,它通

    2024年02月15日
    浏览(36)
  • Java设计模式-责任链模式

    责任链模式,有的地方也会叫职责链模式。它指的是,为请求者和被请求者之间创建一条对象处理链路,避免请求发送者与接受者耦合在一起。 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定

    2024年02月15日
    浏览(42)
  • Java设计模式——责任链模式

    当一个请求需要在多个对象之间传递,每个对象都可能处理该请求或将其传递给下一个对象。在这种情况下,需要避免将发送者与接收者之间的耦合,以及确定请求的处理方式。此时可使用责任链模式,它的优点有降低耦合度(无需关心哪个对象会处理请求),灵活性(可以

    2024年02月21日
    浏览(45)
  • java设计模式(十五)责任链模式

    责任链模式(Chain of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象能够处理它。 抽象处理类: 主要包含一个指向下一处理类的成员变量 nextHandler 和一个处理请求的方

    2024年02月08日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包