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

相关推荐
小小晓.23 分钟前
Qt 对话框、QLineEdit 与布局管理实战详解
开发语言·qt
炸薯条!1 小时前
博客系统测试报告
开发语言·lua
Evand J1 小时前
【MATLAB例程12】永磁同步电机基于增广无迹卡尔曼滤波的未知负载转矩在线观测
开发语言·matlab
Rain的Java大神之路1 小时前
国家数据集团校招、社招都开了:总部雄安,这些技术岗值得认真看看
java·后端·面试
吴名氏.1 小时前
Java转AI Agent教程(第九周)错误矩阵
java·人工智能·矩阵·ai agent
文丑颜不良啊1 小时前
LeetCode1901~1920题目解析
java·leetcode
tealcwu1 小时前
【Unity基础】为什么游戏需要物理按键映射?从 Unity Input Manager 到跨引擎输入设计
java·游戏·unity
vipxieliang2 小时前
Spring Boot 性能优化实战:从启动加速到运行时调优
java·spring boot
AI全栈学习助手2 小时前
告别“转圈等待”:Spring Boot + SSE 让大模型像 ChatGPT 一样流式输出
java·人工智能·spring boot·后端·aigc