Java设计模式之责任链模式(简单易懂)

前言:

         责任链模式(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿着这条链传递该请求。

        网上有很多朋友已经对该模式介绍的非常详细了,也有案例帮助理解,可参考

        Java设计模式之职责链模式

        一篇文章搞懂Java设计模式之责任链模式_lzy_tinyjoy-CSDN博客_java责任链模式

        但是这两篇文章的案例中,对象与对象之间是有先后顺序的,即请求需要先发给组长,再发给经理,不能调换顺序,但是生活中和我们实际开发过程中,对象与对象之间也可以是平行关系,就像产品在流水线上做检查一样,先检查哪一部分都可以,任何一部分有问题,即可返回,不再往后检查。

        本篇文章就是在上面两篇文章上做了改进,改成对象与对象之间是相互独立的并列关系。相比于第一篇文章,增加了处理器对象可动态配置功能。相比于第二篇文章,例子通俗易懂,请求简单化(有些场景不需要对请求进一步封装)。

代码示例:

        该场景描述的是一个待检产品在流水线上检查,产品有两个属性,长度和宽度,流水线上的处理节点也有两个,即长度检查节点和宽度检查节点。为帮助理解,该场景设置的较为简单,实际开发工作中,待检查对象(请求)可以为上下文对象,附带较多属性,同时检查处理节点也可有多个,它们之间是相互独立的。

        产品定义

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 待检验产品
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Product {

    /**
     * 产品长度
     */
    Integer length;

    /**
     * 产品宽度
     */
    Integer width;
}

        处理器执行链定义,责任链的核心在于此

import java.util.ArrayList;
import java.util.List;

public class ProcessorChain{

    // 保存处理节点
    private List<Processor> processorList = new ArrayList<>();
    
    // 处理节点下标
    private int index = 0;

    // 动态扩展处理节点
    public ProcessorChain addProcessor(Processor processor) {
        processorList.add(processor);
        return this;
    }

    // 获取处理器处理
    public boolean process(Product product, ProcessorChain chain) {
        if(index == processorList.size()) {
            return true;
        }
        Processor processor = processorList.get(index);
        index++;
        return processor.process(product, chain);
    }

}

        处理器接口定义

public interface Processor {
    boolean process(Product request, ProcessorChain chain);
}

        长度检查处理器和宽度检查处理器

public class LengthCheckProcessor implements Processor{
    @Override
    public boolean process(Product request, ProcessorChain chain) {
        Integer length = request.getLength();
        if (length < 100 && length > 50) {
            System.out.println("产品长度检验通过");
            return chain.process(request, chain);
        }
        // 产品长度未检验通过
        System.out.println("产品长度未检验通过");
        return false;
    }
}
public class WidthCheckProcessor implements Processor{
    @Override
    public boolean process(Product request, ProcessorChain chain) {
        Integer width = request.getWidth();
        if (width < 100 && width > 50) {
            System.out.println("产品宽度检验通过");
            return chain.process(request, chain);
        }
        // 产品宽度未检验通过
        System.out.println("产品宽度未检验通过");
        return false;
    }
}

        客户端

public class Main {
    public static void main(String[] args) {
        int[][] arrays = {{60, 60}, {40, 40}, {40, 60}, {60, 40}};
        for (int[] array : arrays) {
            ProcessorChain processorChain = new ProcessorChain();
            processorChain.addProcessor(new LengthCheckProcessor());
            processorChain.addProcessor(new WidthCheckProcessor());

            Product product = new Product(array[0], array[1]);
            boolean checkResult = processorChain.process(product, processorChain);
            if(checkResult) {
                System.out.println("产品最终检验合格");
            } else {
                System.out.println("产品最终检验不合格");
            }
            System.out.println();
        }

    }
}

        结果:

产品长度检验通过
产品宽度检验通过
产品最终检验合格

产品长度未检验通过
产品最终检验不合格

产品长度未检验通过
产品最终检验不合格

产品长度检验通过
产品宽度未检验通过
产品最终检验不合格

总结与改进:

        1. 每个处理器可以通过注解扫描的方式添加进执行链中,不必在客户端中人为添加,只需自己定义处理器,实现处理器接口,添加该处理器的执行逻辑。

        2. 待处理的请求对象可以是上下文对象,上下文对象中封装待检查条件,并将检查结果写入到上下文对象中。

如有问题,欢迎指正。也可加QQ 2422035338沟通交流。

参考:

1.  https://segmentfault.com/a/1190000014940291

2. 一篇文章搞懂Java设计模式之责任链模式_lzy_tinyjoy-CSDN博客_java责任链模式

Java 责任链模式是一种设计模式,主要用于处理请求。在这种模式中,多个对象形成一个链并依次处理请求,直到有一个对象可以处理它为止。Java 责任链模式虽然简单,但却非常强大,可以应用于许多场景。 Java 责任链模式有三种实现方式: 1、基于 OOP 实现 这种实现方式是最基本的责任链模式,代码中将每个处理者定义为一个独立的类,并且将它们按照顺序连接在一起。 这种实现方式的优点是简单易懂,代码可读性高,容易扩展。缺点是类的数量可能会很多,需要提前确定好责任链的完整结构,不太灵活。 2、基于注解实现 基于注解实现 Java 责任链模式,需要使用 Java 的反射机制。通过定义注解类型,在接口方法上添加注解,再通过反射来寻找哪些方法应该被执行,找到后按顺序执行。如果某一个处理器不需要被执行,就可以跳过它。 这种实现方式的优点是利用注解功能可以不用创建很多类,代码可读性较好。缺点是需要使用反射来执行方法,会影响性能,不太容易排错。 3、基于 Spring AOP 实现 基于 Spring AOP 实现 Java 责任链模式,需要使用 Spring 框架的 AOP 功能。利用 AOP,可以在不修改业务代码的情况下,动态地将处理器按照顺序连接在一起,然后依次执行。 这种实现方式的优点是简单、灵活,可以动态修改责任链的结构。缺点是有一定的学习门槛,需要掌握 Spring AOP 的相关知识。 总结起来,根据具体情况选择不同的实现方式,都可以实现 Java 责任链模式。除了以上三种实现方式,还可以使用 lambda 表达式来实现责任链。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值