广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java设计模式之责任链模式的示例详解
  • 586
分享到

Java设计模式之责任链模式的示例详解

Java 设计模式 责任链模式Java 责任链模式 2022-11-13 19:11:45 586人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录应用场景实际代码案例无模式情况下的代码采用责任链模式优化代码采用建造者+责任链模式优化代码责任链模式优缺点责任链模式是将链中的每一个节点看做是一个对象,每个节点处理的请求均不相同

责任链模式是将链中的每一个节点看做是一个对象,每个节点处理的请求均不相同,且内部自动维护下一个节点对象,当一个请求从链式的首段发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求位置,属于行为模式。

这里需要注意的是每个节点都能对对象进行一定的处理(也可以不处理),处理完成之后节点再进行判断还要进行后续处理还是说传递给下一个节点。

应用场景

首先举一个日常的例子,比如我们申请开发票,首先我们要写好报销单,首先要你的部门领导审批,部门领导审批不通过直接打回,审批通过再由公司的总经理审批这里审批通过才算成审批完成。这种情况就很适合使用责任链模式。

总结一下责任链主要适用一下几种情况:

  • 多个对象可以处理同一个请求,但是具体由那个对象处理完成则在运行时决定。
  • 不明确指定接收者的情况下,向多个对象中的一个提交一个请求

可以看一下责任链模式的通用UML类图:

通过类图可以看到总共包含以下角色:

  • 抽象处理者:主要是定义处理请求的方法以及维护下一个处理结点的对象的引用
  • 具体处理者:处理的具体实现

责任链的精髓在于将很多处理节点行成个链式结构,并允许结点自身决定是否进行处理或者转发。

实际代码案例

下面举一个我们在开发时经常会遇到的一种情况:登录 比如我们开发一个管理系统在登录的时候往往我们会先判断客户端传递的账号及密码是否为空但凡有一个是空肯定是不能继续往下走的,然后就是根据用户账号密码拿到用户的所有信息,如果能拿到继续周下一步,拿不到则是报错提示用户不存在,到下一步又会判断当前用户的权限。

无模式情况下的代码

private String login(String username,String passWord) {
    if(username == null || password == null) {
        return "账户或者密码为null";
    }
    User user = queryUserInfo(username, password);
    if(user == null) {
        return "找不到用户";
    }
    if(!Objects.equals(user.getRoleName(), "超管")){
        return "没有权限";
    }
    return "登录成功";

}

private User queryUserInfo(String username,String password){
    if(Objects.equals(username, "土豆") && Objects.equals(password, "666666")) {
        return new User(username,password,"超管");
    }else if(Objects.equals(username, "土豆2号") && Objects.equals(password, "666666")){
        return new User(username,password,"普通员工");
    }
    return null;
}

发现判断代码都冗余在一个方法里面,后续改动修改都需要修改中这个方法不满足开闭原则。

采用责任链模式优化代码

首先创建抽象类规定抽象方法以及维护下一个节点

public abstract class Handler {
    protected Handler next;

    public void setNext(Handler next) {
        this.next = next;
    }

    public abstract void doHandler(User user);
}

然后就是创建多个实现逻辑的节点对象:

public class ValidatedHandler extends Handler {
    @Override
    public void doHandler(User user) {
        if(user.getUsername() == null || user.getPassword() == null) {
            System.out.println("账户或者密码为null");
        }else{
            this.next.doHandler(user);
        }
    }
}
public class UserHandler extends Handler{
    @Override
    public void doHandler(User user) {
        queryUserInfo(user);
        if(user.getRoleName() == null){
            System.out.println("没有找到用户");
        }else{
            this.next.doHandler(user);
        }
    }
    private static void queryUserInfo(User user){
        if(Objects.equals(user.getUsername(), "土豆") && Objects.equals(user.getPassword(), "666666")) {
            user.setRoleName("超管");
        }else if(Objects.equals(user.getUsername(), "土豆2号") && Objects.equals(user.getPassword(), "666666")){
            user.setRoleName("普通员工");
        }
    }
}
public class AuthHandler extends Handler{
    @Override
    public void doHandler(User user) {
        if(!Objects.equals(user.getRoleName(), "超管")){
            System.out.println("没有权限");
        }
        System.out.println("登入成功");
    }
}

最后调用:

public static void main(String[] args) {
    User user = new User("土豆","666666");
    Handler validatedHandler = new ValidatedHandler();
    Handler userHandler = new UserHandler();
    Handler authHandler = new AuthHandler();
    validatedHandler.setNext(userHandler);
    userHandler.setNext(authHandler);
    validatedHandler.doHandler(user);

}

可以看一下UML类图:

采用建造者+责任链模式优化代码

上述的代码发现维护链表的操作在用户调用的那一层,链表的组装过于复杂,这个时候我们可以使用建造者模式, 自动维护链表的组装,调用者只需要指定链表的顺序即可 主要修改Handler内代码:

public abstract class Handler {
    protected Handler next;

    public void setNext(Handler next) {
        this.next = next;
    }

    public abstract void doHandler(User user);

    public static class Builder {
        private Handler head;
        private Handler tail;

        public Builder addHandler(Handler handler) {
            if(this.head == null){
                this.head = this.tail = handler;
                return this;
            }
            this.tail.setNext(handler);
            this.tail = handler;
            return this;
        }

        public Handler build() {
            return this.head;
        }
    }
}
Handler.Builder builder = new Handler.Builder();
builder.addHandler(new ValidatedHandler())
        .addHandler(new UserHandler())
        .addHandler(new AuthHandler());
builder.build().doHandler(user);

可发现调用者只需要关心链表顺序写入就好

责任链模式优缺点

优点:

  • 请求与处理解耦
  • 处理者只需要关心自己的处理逻辑即可,如果不是自己的直接转发
  • 具有链式传递功能,请求者不需要关系链路结构等待结果就好
  • 易于维护,可以很灵活的修改链路的结构新增或者删除,符合开闭原则

缺点:

  • 会出现循环引用的情况
  • 责任链太长会影响性能

到此这篇关于Java设计模式之责任链模式的示例详解的文章就介绍到这了,更多相关Java责任链模式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java设计模式之责任链模式的示例详解

本文链接: https://www.lsjlt.com/news/170656.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java设计模式之责任链模式的示例详解
    目录应用场景实际代码案例无模式情况下的代码采用责任链模式优化代码采用建造者+责任链模式优化代码责任链模式优缺点责任链模式是将链中的每一个节点看做是一个对象,每个节点处理的请求均不相同...
    99+
    2022-11-13
    Java 设计模式 责任链模式 Java 责任链模式
  • Java设计模式之责任链模式详解
    一、前言 各个部门协同合作完成一个任务,每个部门都有各自的职责,一个部门完成后,变回转交给下一个部门,直到所有部门都处理了,这个任务才完成。 将请求与处理解耦。 处理者只需要关注自己...
    99+
    2022-11-12
  • Java设计模式之java责任链模式详解
    目录概述结构总结在本讲,我们来学习一下行为型模式里面的第四个设计模式,即责任链模式。 概述 在学习责任链模式之前,我们先来看一下下面这段描述。 在现实生活中,常常会出现这样的事例:一...
    99+
    2022-11-12
  • Java 设计模式之责任链模式及异步责任链详解
    目录一、定义二、普通责任链模式三、异步责任链模式一、定义 责任链模式(Chain of Responsibility Pattern):避免将一个请求的发送者与接受者耦合在一起,让多...
    99+
    2022-11-12
  • Java设计模式之责任链模式
    本文通过图书馆管理系统中,用户名校验、密码校验、需要增加问题,每次都要增加if判断语句,将其改用责任链模式进行链式调用,为了让代码更加的优雅,我们使用之前学过的建造者模式就代码进行改...
    99+
    2022-11-13
  • 详解Java实现设计模式之责任链模式
    目录一、模拟业务需求二、小步小跑的迭代开发三、系统对数据的校验要求四、新建一个抽象类五、子类的实现六、构建责任链和调用七、可维护性八、总结8.1、责任链模式8.2、责任链模式适用的场...
    99+
    2022-11-12
  • java设计模式责任链模式原理案例详解
    目录引言责任链模式定义类图角色核心示例代码1、对请求处理者的抽象2、对请求处理者的抽象3、责任链的创建责任链实现请假案例案例类图可扩展性纯与不纯的责任链模式纯的责任链模式不纯的责任链...
    99+
    2022-11-12
  • Java中常用的设计模式之责任链模式详解
    目录优点缺点使用场景一、实现方式1、处理抽象类2、学生处理类3、老师处理类4、校长处理类5、测试二、实现方式1、订单信息类2、订单校验接口3、库存校验器4、价格校验器5、测试总结优点...
    99+
    2022-11-13
  • Java设计模式之职责链模式详解
    目录前言一、职责链模式的定义与特点二、职责链模式的结构三、职责链模式案例前言 本文简单介绍了设计模式的一种——职责链模式  一、职责链模式的定义与特点 定义: 为了避免请求发送者与多...
    99+
    2022-11-12
  • JavaScript设计模式之责任链模式的的示例分析
    这篇文章主要介绍了JavaScript设计模式之责任链模式的的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本文实例讲述了JavaS...
    99+
    2022-10-19
  • Java实现设计模式之责任链模式
    目录1.什么是责任链模式2.如何实现3.代码实现4.总结1.什么是责任链模式 当一个请求可能需要多个对象中的某个进行处理时,将这些对象连成一条链,并沿者这条链传递该请求,知道有一个对...
    99+
    2022-11-13
  • java设计模式(实战)-责任链模式
    目录一:模式说明二:项目实战三:源代码一:模式说明 模式定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,...
    99+
    2022-11-12
  • JavaScript设计模式之职责链模式详解
    目录职责链模式1. 现实中的职责链模式2. 实际开发中的职责链模式3. 用职责链模式重构代码4. 灵活可拆分的职责链节点5. 异步的职责链6. 职责链模式的优缺点7. 用 AOP 实...
    99+
    2022-11-13
    JavaScript 设计模式 JavaScript 职责链模式
  • Java责任链模式详解
    目录一、概念二、结构三、实现方式四、应用案例五、总结责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它用于将请求的发送者和接收者解耦...
    99+
    2023-05-20
    Java 设计模式 Java 责任链模式
  • Java经典设计模式之责任链模式原理与用法详解
    本文实例讲述了Java经典设计模式之责任链模式。分享给大家供大家参考,具体如下:责任链模式:多个对象由其对象对应下家的引用连成一条链,请求在这个链上传递,直到链上的某一个接收对象处理此请求。因为请求的客户端并不知道链上最终是谁来处理这个请求...
    99+
    2023-05-31
    java 设计模式 责任链模式
  • JavaScript设计模式之职责链模式的示例分析
    小编给大家分享一下JavaScript设计模式之职责链模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!java基本数据类型有哪些Java的基本数据类型...
    99+
    2023-06-14
  • 每天一个设计模式之责任链模式
    作者按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现。诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) 0. 项目地址 责任链模式·代码 《每天一个设...
    99+
    2023-01-31
    模式 责任
  • Java通俗易懂系列设计模式之责任链模式
    目录概述JDK中的责任链模式示例责任链设计模式示例责任链设计模式 - 基类和接口责任链模式 - 链实现责任链设计模式 - 创建链责任链设计模式类图责任链设计模式重点JDK中的责任链模...
    99+
    2022-11-12
  • java设计模式中的责任链模式是什么
    本篇文章为大家展示了java设计模式中的责任链模式是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一:模式说明模式定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。...
    99+
    2023-06-22
  • 深入了解Java设计模式之职责链模式
    目录定义解决的问题核心要点类图代码实现抽象父类执行者-三个客户端拓展应用场景定义 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作