Java设计模式-责任链模式

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

责任链模式

1.责任链模式含义

责任链模式,有的地方也会叫职责链模式。它指的是,为请求者和被请求者之间创建一条对象处理链路,避免请求发送者与接受者耦合在一起。

在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任

责任链模式里的责任,指的是类对象所承担的职责,当每一个对象对其下家引用,就会形成一条链路,那么这一条链上的所有的对象的职责也就串起来了,这样就形成了责任链,责任链的名字就是这样来的。

2.责任链代码示例

2.1Request类

Request类用于封装请求的相关内容

public class Request {
    private String requestType;

    private String requestContent;

    private int number;

    public String getRequestType() {
        return requestType;
    }

    public void setRequestType(String requestType) {
        this.requestType = requestType;
    }

    public String getRequestContent() {
        return requestContent;
    }

    public void setRequestContent(String requestContent) {
        this.requestContent = requestContent;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }
}

2.2Manager类

Manager类是被请求类,用于处理请求

public class Manager {
    protected String name;

    public Manager(String name) {
        this.name = name;
    }

    public void getResult(String managerLevel, Request request){
        if ("经理".equals(managerLevel)) {
            if ("请假".equals(request.getRequestType()) && request.getNumber() <= 2){
                System.out.println(String.format("%s%s请假%d被批准", name, request.getRequestContent(), request.getNumber()));
            } else {
                System.out.println(String.format("%s%s请假%d我无权处理", name, request.getRequestContent(), request.getNumber()));
            }
        } else if ("总监".equals(managerLevel)) {
            if ("请假".equals(request.getRequestType()) && request.getNumber() <= 5){
                System.out.println(String.format("%s%s请假%d被批准", name, request.getRequestContent(), request.getNumber()));
            } else {
                System.out.println(String.format("%s%s请假%d我无权处理", name, request.getRequestContent(), request.getNumber()));
            }
        } else if ("总经理".equals(managerLevel)) {
            if ("请假".equals(request.getRequestType()) ){
                System.out.println(String.format("%s%s请假%d被批准", name, request.getRequestContent(), request.getNumber()));
            } else if ("加薪".equals(request.getRequestType()) && request.getNumber() <= 500){
                System.out.println(String.format("%s%s数量%d被批准", name, request.getRequestContent(), request.getNumber()));
            } else if ("加薪".equals(request.getRequestType()) && request.getNumber() > 500){
                System.out.println(String.format("%s%s数量%d再说吧", name, request.getRequestContent(), request.getNumber()));
            }
        }
    }
}

可以看到,Manager类的getResult方法里面,有大量的条件判断分支,这就导致了Manager这个类的职责太大了,违反了单一职责的原则,如果增加新的职位,比如总经理秘书,那么就要修改原代码,并对这个复杂的分支再加上新的条件分支,也违背了开闭原则。所以需要对这个类进行改造,而改造这个类,就使用责任链模式。

2.3Manager类重构

1.首先将Manager类改为抽象类,抽象类中设置一个Manage属性,并定义抽象的请求处理方法。

public abstract class Manager {
    protected String name;

    protected Manager superior;

    public Manager(String name) {
        this.name = name;
    }

    public void setSuperior(Manager superior) {
        this.superior = superior;
    }

    public abstract void requestApplications(Request request);
}

2.新建Manager的子类CommonManger,负责处理原Manager类中的第一个if条件分支

public class CommonManager extends Manager{
    public CommonManager(String name) {
        super(name);
    }

    @Override
    public void requestApplications(Request request) {
        if ("请假".equals(request.getRequestType()) && request.getNumber() <= 2){
            System.out.println(String.format("%s%s请假%d被批准", name, request.getRequestContent(), request.getNumber()));
        } else {
            if (superior != null) {
                superior.requestApplications(request);
            }
        }
    }
}

3.新建Manager的子类Majordomo类,负责处理原Manager类中的第二个if条件分支

public class Majordomo extends Manager{
    public Majordomo(String name) {
        super(name);
    }

    @Override
    public void requestApplications(Request request) {
        if ("请假".equals(request.getRequestType()) && request.getNumber() <= 5){
            System.out.println(String.format("%s%s请假%d被批准", name, request.getRequestContent(), request.getNumber()));
        } else {
            if (superior != null) {
                superior.requestApplications(request);
            }
        }
    }
}

4.新建Manager的子类GeneralManager类,负责处理原Manager类中的第三个if分支

public class GeneralManager extends Manager{
    public GeneralManager(String name) {
        super(name);
    }

    @Override
    public void requestApplications(Request request) {
        if ("请假".equals(request.getRequestType()) ){
            System.out.println(String.format("%s%s请假%d被批准", name, request.getRequestContent(), request.getNumber()));
        } else if ("加薪".equals(request.getRequestType()) && request.getNumber() <= 500){
            System.out.println(String.format("%s%s数量%d被批准", name, request.getRequestContent(), request.getNumber()));
        } else if ("加薪".equals(request.getRequestType()) && request.getNumber() > 500){
            System.out.println(String.format("%s%s数量%d再说吧", name, request.getRequestContent(), request.getNumber()));
        }
    }
}

5.测试类

public class MainApp {
    public static void main(String[] args) {
        CommonManager jingli = new CommonManager("经理");
        Majordomo zongjian = new Majordomo("总监");
        GeneralManager zjingli = new GeneralManager("总经理");

        jingli.setSuperior(zongjian);
        zongjian.setSuperior(zjingli);

        Request request = new Request();
        request.setRequestType("请假");
        request.setRequestContent("秋秋请假");
        request.setNumber(1);
        jingli.requestApplications(request);

        Request request2 = new Request();
        request2.setRequestType("请假");
        request2.setRequestContent("秋秋请假");
        request2.setNumber(4);
        jingli.requestApplications(request2);

        Request request3 = new Request();
        request3.setRequestType("加薪");
        request3.setRequestContent("秋秋要加薪");
        request3.setNumber(500);
        jingli.requestApplications(request3);

        Request request4 = new Request();
        request4.setRequestType("加薪");
        request4.setRequestContent("秋秋要加薪");
        request4.setNumber(10000);
        jingli.requestApplications(request4);

    }
}

运行结果

经理秋秋请假请假1被批准
总监秋秋请假请假4被批准
总经理秋秋要加薪数量500被批准
总经理秋秋要加薪数量10000再说吧

从Manager类的改造结果来看,原来Manager类的条件分支被均匀的分散到新Manager类的三个子类中,新的Manager的三个子类中又相继调用了条件分支的下一个子类,最终三个子类串联起来,形成了一个责任链。这样每个子类所承担的职责仅有一个if条件分支,职责单一,如果要新增新的条件分支,比如新增总经理秘书的分支,此时只需要新建一个Manager的子类,总经理秘书类,即可完成新分支的创建,不会修改原来的分支,符合开闭原则。

3.总结

责任链中最关键的就是,当客户提交一个请求的时候,请求是沿着链传递下去的,直到有一个对象来处理这个请求。请求者不用管哪个对象来处理,反正请求最终会被这个责任链给处理掉。

这就使得接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是责任链可以简化为对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接受者的引用,这就大大降低了耦合度。

由于链式结构是在客户端定义的,所以客户端可以随时地增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。

不过责任链处理也要考虑全面,防止某个请求一直到链的末端都没有被正确处理。

以上就是责任链模式的内容了,责任链这个名字听着高大上,但其实原理还是很简单的,不要被名字吓到。文章来源地址https://www.toymoban.com/news/detail-608875.html

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

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

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

相关文章

  • 【设计模式】Java 设计模式之责任链模式(Chain of Responsibility)

    责任链模式(Chain of Responsibility) 一、概述 责任链模式是一种行为设计模式,它允许请求在对象链中传递。每个对象都有机会处理该请求,并且能将其传递给链中的下一个对象。这种模式为请求创建了一个处理对象的链,并沿着这条链传递该请求,直到有一个对象处理它为止

    2024年03月22日
    浏览(42)
  • 【玩转23种Java设计模式】行为型模式篇:责任链模式

    软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接:【玩转23种Java设计模式】学习目录汇总

    2024年02月13日
    浏览(35)
  • Java设计模式-责任链(Chain of Responsibility)模式

    Java责任链(Chain of Responsibility)设计模式是指很多处理对象构成一个链,链中前一个对象指向后一个对象。请求在链中传递,一个请求可以被一个或者多个对象处理。调用方(即客户端)不知道请求会被链中的哪个对象处理,所以责任链模式可以方便组织责任链而不影响调用

    2024年02月16日
    浏览(46)
  • Java设计模式—责任链模式(Chin of Responsibility)

    目录 前言 一、责任链模式的简介 二、责任链模式的概念 三、责任链模式的作用 四、责任链模式的优、缺点 1.责任链模式的优点 2.责任链模式的缺点 五、责任链模式的应用场景 六、代码案例 UML类图  1.定义一个请求枚举类  2.定义一个请求类 3.定义一个抽象处理接口 4、定

    2024年02月08日
    浏览(35)
  • Java设计模式之责任链模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设计模式之责任链模式 OA系统采购审批需求 传统方案解决OA系

    2024年02月06日
    浏览(41)
  • Java 大厂八股文面试专题-设计模式 工厂方法模式、策略模式、责任链模式

            在平时的开发中,涉及到设计模式的有两块内容,第一个是我们 平时使用的框架 (比如spring、mybatis等),第二个是我们自己开发业务使用的设计模式。         面试官一般比较关心的是你在开发过程中, 有没有使用过设计模式,或者你在简历上写了关于设计

    2024年02月10日
    浏览(56)
  • Java设计模式之行为型-责任链模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、在Java中实现 4.2、在SpringBoot中实现  五、总结  责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送。请求会被链上每个处理者处理,直到请求被处理完毕。该模式主要解决的是请求的发送者和

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

    遇到一个面试的场景题目,让实现税率的计算 请使用Java语言实现如下税率计算: 1~5000 税率 0 5001~8000 3% 8001~17000 10% 17001~30000 20% 30001~40000 25% 40001~60000 30% 60001~85000 35% 85001~ 45% 要求 ⅰ. 逻辑正确,代码优雅 ⅱ. 可扩展性,考虑区间的变化,比如说起征点从5000变成10000等等,或者

    2024年02月11日
    浏览(34)
  • 【设计模式】责任链模式

    顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处

    2024年02月12日
    浏览(39)
  • 设计模式—责任链模式

    一、待解决问题 : 减少代码中 if else 语句,降低代码圈复杂度或深度,增强可读性。 1、需求背景: 采购订单创建,需要验证采购员、物料、供应商、供应商的银行账号等信息。如采购员权限到期、或供应商失效等问题,都无法下单。 2、代码如下: 学习使用责任链模式后

    2024年02月10日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包