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

相关推荐
用户0332126663671 分钟前
在Word 中插入页眉页脚:实用 Java 指南
java
奔跑吧邓邓子3 分钟前
【Java实战㊱】Spring Boot邂逅Redis:缓存加速的奇妙之旅
java·spring boot·redis·缓存·实战
杨杨杨大侠4 分钟前
Atlas-Event:高性能事件处理与监控系统
java·github·eventbus
杨杨杨大侠7 分钟前
Atlas Event:解锁事件驱动的潜能
java·github·eventbus
ForteScarlet10 分钟前
Kotlin 2.2.20 现已发布!下个版本的特性抢先看!
android·开发语言·kotlin·jetbrains
失散1312 分钟前
分布式专题——4 大厂生产级Redis高并发分布式锁实战
java·redis·分布式·缓存·架构
MacroZheng14 分钟前
堪称一站式管理平台,同时支持Linux、MySQL、Redis、MongoDB可视化管理!
java·linux·后端
anlogic19 分钟前
Java基础 9.10
java·开发语言·算法
SimonKing20 分钟前
数据库又慢了?你需要一个像样的慢SQL报警系统
java·后端·程序员
yongche_shi23 分钟前
第二篇:Python“装包”与“拆包”的艺术:可迭代对象、迭代器、生成器
开发语言·python·面试·面试宝典·生成器·拆包·装包