15 责任链模式

news/2024/5/19 16:03:20 标签: 责任链模式, java, 开发语言

责任链模式

简要描述:
case1:一个对象不知道要被谁处理,在一个方法里面做判断显得过于冗余,这个时候就可以使用责任链模式,直接将对象丢进责任链中,传递到对应的处理器中就会进行处理。
case2:可以对一个对象进行一系列加工处理,责任链上的每一个节点都可以看着是处理对象的一个步骤。
case3:还可以进行校验,上一个校验步骤根据校验结果判断是否传递到下一个校验步骤。
在这里插入图片描述

一个简单的demo

抽象的处理者,不做具体的处理,定义好处理的方法handler()和设置下一个节点的方法setNext(),定义一个调用流程模板doing(),避免子类有繁琐的代码。

java">/**
 * 流程是规定好的,执行当前之后再执行下一步,
 * 可以用模板方法定义好。
 */
abstract class AbstractChainHandler{
    private AbstractChainHandler chainHandler;
    /**
     * 链条上的节点的具体细节
     */
    protected abstract boolean handler();
    // 链条启动方法
    public final void doing(){
        boolean handler = handler();
        // 根据处理结果判断是否继续递归下去。
        if (!handler) return;
        chainHandler.doing();
    }

    /**
     * 设置下一个节点
     * @param chainHandler
     */
    public final void setNext(AbstractChainHandler chainHandler) {
        this.chainHandler = chainHandler;
    }
}

一些具体的实现类,进行各种校验

java">class NameHandler extends AbstractChainHandler{
    /**
     * 链条上的节点的具体细节
     */
    @Override
    protected boolean handler() {
        System.out.println("校验姓名");
        return true;
    }
}
class PasswdHandler extends AbstractChainHandler{
    /**
     * 链条上的节点的具体细节
     */
    @Override
    protected boolean handler() {
        System.out.println("密码校验");
        return true;
    }
}
class AgeHandler extends AbstractChainHandler{
    /**
     * 链条上的节点的具体细节
     */
    @Override
    protected boolean handler() {
        System.out.println("年龄校验");
        return false;
    }
}
class UnHandler extends AbstractChainHandler{
    /**
     * 链条上的节点的具体细节
     */
    @Override
    protected boolean handler() {
        System.out.println("不知道校验啥");
        return true;
    }
}

客户端,定义链条的顺序

java">public class HandlerPattern {
    public static void main(String[] args) {
        // 创建链条上的每一个节点
        AbstractChainHandler nameHandler = new NameHandler();
        AbstractChainHandler passwdHandler = new PasswdHandler();
        AbstractChainHandler ageHandler = new AgeHandler();
        AbstractChainHandler unHandler = new UnHandler();
        // 将链条串起来
        nameHandler.setNext(passwdHandler);
        passwdHandler.setNext(ageHandler);
        ageHandler.setNext(unHandler);
        // 开始执行
        nameHandler.doing();
    }
}

完整代码见
txgitee


http://www.niftyadmin.cn/n/5327184.html

相关文章

如何关闭iPhone 14或14 Pro Max,这里有详细步骤

你刚买了新的iphone 14或iphone 14 pro max,迫不及待地想开始使用它。但如果你需要关闭它怎么办?有几种方法可以用来关闭这两种设备。 如何关闭iPhone 14 你可以通过每个人都熟悉的老式侧按钮轻松关闭iPhone 14,也可以通过面部识别关闭它。 …

代码随想录第六十三天——被围绕的区域,太平洋大西洋水流问题,最大人工岛

leetcode 130. 被围绕的区域 题目链接:被围绕的区域 步骤一:深搜或者广搜将地图周边的’O’全部改成’A’ 步骤二:遍历地图,将’O’全部改成’X’,将’A’改回’O’ class Solution { private:int dir[4][2] {-1, 0…

编码技巧:如何在Golang中高效解析和生成XML

编码技巧:如何在Golang中高效解析和生成XML 引言Golang中的XML基础解析XML文件生成XML文件错误处理和调试高级技巧和最佳实践总结 引言 在当今数据驱动的编程世界中,有效地处理各种数据格式是每个开发人员必备的技能之一。其中,XML&#xff…

赋能虚拟教学革命,实时云渲染助力复旦大学打造元宇宙教学

在风起云涌之后元宇宙行业也如大浪淘沙洗尽铅华一般,开始趋于理性和务实,虽然元宇宙已不高亮在舞台的正中心,但越来越多的贴近一线应用正依托元宇宙几年来的发展积累,绽放出许多实实在在且具有潜力的新亮点。 在教育元宇宙领域便…

算法-二分专题

文章目录 概念应用场景代码模板OJ练习寻找指定元素1题目描述输入描述输出描述样例题解 寻找指定元素2题目描述输入描述输出描述样例题解 寻找指定元素3题目描述输入描述输出描述样例题解 寻找指定元素4题目描述输入描述输出描述样例题解 寻找指定元素5题目描述输入描述输出描述…

专业、高效的解决方案:为企业业务提供强大支持

随着市场竞争的日益激烈,企业要想在众多竞争对手中脱颖而出,必须具备强大的核心竞争力。而这种竞争力的源泉,往往来自于企业所提供的产品和服务。为了确保产品和服务的质量,企业需要不断地进行技术创新和管理创新,以满…

【Delphi 基础知识 19】Assigned的用法

在Delphi中,Assigned 是一个用于检查指针是否已分配内存的函数。它通常用于检查对象或指针是否已经被分配内存,以避免在未分配内存的情况下引用或操作它。 以下是 Assigned 的一些用法示例: 检查对象是否已分配内存: varMyObject…

x-cmd pkg | smartctl - 用于监测和分析硬盘的工具

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 smartctl 是一个用于监测和分析硬盘中 S.M.A.R.T.(自我检测,分析和报告技术)信息的命令行工具,是 Smartmontools 的一部分。通过 smartctl 工具,可以分析各种…