代码重构之责任链设计模式

本文详细介绍了责任链模式在Java Web中过滤器链的应用,通过DurationFilter、RiskFilter和TimesFilter的实例演示如何降低耦合,实现动态职责分配。同时,探讨了其优缺点及与Spring Boot集成的可能性。

低功耗蓝牙项目,需要一块懂省电的板

思澈 SF32LB52 芯片,BLE 协议栈深度优化,上手即开发

一、责任链模式

1.什么是责任链模式

责任链模式(Chain of Responsibility Pattern)中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

责任链模式: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的额偶合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.

2.使用场景

在JavaWeb中 过滤器链的实现,实际上就是一种责任链模式

3.优缺点

优点:

  • 降低耦合度。它将请求的发送者和接收者解耦。
  • 简化了对象。使得对象不需要知道链的结构。
  • 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
  • 增加新的请求处理类很方便。

缺点:

  • 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
  • 可能不容易观察运行时的特征,有碍于除错。

二、最简单的实现

目前有一个数据需要进行多项检查:时效性检验、风控拦截检验、次数限制检验等,每个校验之间相互分开成为单独的类。其实现代码如下:

1、定义过滤接口Filter

package com.tang.chain.handler;

public interface Filter {

    /**
     * 过滤检查
     *
     * @param data
     */
    void handle(String data);


    /**
     * 设置下一个
     *
     * @param filter
     */
    void setNext(Filter filter);

    /**
     * 获取下一个
     *
     * @return
     */
    Filter next();
}

2、编写对应的三种检查过滤实现类

import com.tang.chain.handler.Filter;

public class DurationFilter implements Filter {

    private Filter nextFilter;

    public DurationFilter(){

    }

    public DurationFilter(Filter filter){
        this.nextFilter=filter;
    }

    @Override
    public void handle(String data) {
        System.out.println("时效性检验:"+data);
    }

    @Override
    public void setNext(Filter filter){
        this.nextFilter=filter;
    }

    @Override
    public Filter next(){
        return nextFilter;
    }
}
import com.tang.chain.handler.Filter;

public class RiskFilter implements Filter {

    private Filter nextFilter;

    public RiskFilter(){

    }

    public RiskFilter(Filter filter){
        this.nextFilter=filter;
    }

    @Override
    public void handle(String data) {
        System.out.println("风控拦截检验:"+data);
    }

    @Override
    public void setNext(Filter filter){
        this.nextFilter=filter;
    }

    @Override
    public Filter next(){
        return nextFilter;
    }
}
import com.tang.chain.handler.Filter;

public class TimesFilter implements Filter {

    private Filter nextFilter;

    public TimesFilter(){

    }

    public TimesFilter(Filter filter){
        this.nextFilter=filter;
    }

    @Override
    public void handle(String data) {
        System.out.println("次数限制检验:"+data);
    }

    @Override
    public void setNext(Filter filter){
        this.nextFilter=filter;
    }

    @Override
    public Filter next(){
        return nextFilter;
    }
}

3、编写单元测试

import com.tang.chain.handler.Filter;
import com.tang.chain.handler.impl.DurationFilter;
import com.tang.chain.handler.impl.RiskFilter;
import com.tang.chain.handler.impl.TimesFilter;


public class ChainApplication {

    public static void test01() {
        String data = "hello world!";
		
		//手动装配责任链
        Filter fiterChain = new DurationFilter(new RiskFilter(new TimesFilter(null)));
        while (null != fiterChain) {
            fiterChain.handle(data);
            fiterChain = fiterChain.next();
        }
    }

    public static void test02() {
        String data = "hello world!";

        Filter durationFilter = new DurationFilter();
        Filter riskFilter = new RiskFilter();
        Filter timesFilter = new TimesFilter();

		//手动装配责任链
        durationFilter.setNext(riskFilter);
        riskFilter.setNext(timesFilter);
        timesFilter.setNext(null);

        Filter rootFilter = durationFilter;
        while (null != rootFilter) {
            rootFilter.handle(data);
            rootFilter = rootFilter.next();
        }
    }

    public static void main(String[] args) {
        test02();
    }
}

三、总结

以上就是责任链模式基本的用法. 责任链也被称作职责链,每一个职责都能被定义成一个处理对象. 使用责任链模式能够帮助我们在业务代码中更优雅地实现非互斥的多if判断.在需要扩展的时候也能更加轻松.

上述只是通过编码手动方式配置的责任链,当然也可以借助于SpringBoot框架中的IOC容器来实现自动配置。可参考:https://www.heyinglei.com/archives/java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E8%B4%A3%E4%BB%BB%E9%93%BE%E6%A8%A1%E5%BC%8F

低功耗蓝牙项目,需要一块懂省电的板

思澈 SF32LB52 芯片,BLE 协议栈深度优化,上手即开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值