15 责任链模式

责任链模式

简要描述:

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

相关推荐
蛋蛋的就会顺顺的9 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要8269 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡10 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
死磕音视频10 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
伯恩bourne11 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_12 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
省钱兄--zs12 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲12 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog13 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户212968352616813 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm