使用责任链模式 构建自己的过滤器

本文介绍了如何利用责任链模式来构建过滤器系统,通过分解业务逻辑以达到代码解耦的效果。文章详细展示了责任链模式的抽象类定义,以及两个具体的拦截器实现,并提供了初始化、配置和测试的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.责任链模式
通过将耦合在一起的业务逻辑分离开,达到解耦效果。
2.代码:

责任链抽象类

public abstract class Handler {
    /**
     * 存储处理器的队列
     */
    public static BlockingQueue<Handler> localQueue = new ArrayBlockingQueue<>(10);

    /**
     * 指向下一个处理器的指针
     */
    public Handler nexthandler;


    /**
     * 添加处理器
     *
     * @param handler
     */
    public static void addHandler(Handler handler) {
        localQueue.offer(handler);
    }

    /**
     * 加载处理器 形成责任链
     */
    public static void loadHandler() {
        Handler head = localQueue.poll();
        int size = localQueue.size();
        for (int i = 1; i <= size; i++) {
            Handler poll = localQueue.poll();
            head.nexthandler = poll;
            head = poll;
        }
    }

    /**
     * 递归执行各个过滤器
     *
     * @param msg
     * @return
     */
    public String doHanle(String msg) {
        //压栈执行 保证按处理器顺序执行 结果带到下一个栈帧
        String result = handleTask(msg);
        if (null != nexthandler) {
            result = nexthandler.doHanle(result);
        }
        return result;
    }

    /**
     * 规定各个处理器的执行接口
     *
     * @param msg
     * @return
     */
    protected abstract String handleTask(String msg);
}

拦截器1

public class Intercepter extends Handler {
    @Override
    protected String handleTask(String msg) {
        String s = msg.toLowerCase();
        System.out.println("过滤器1,转为小写,执行结果"+s);
        return s;
    }
}

拦截器2

public class Intercepter2 extends Handler {
    @Override
    protected String handleTask(String msg) {
        String s = msg.substring(0, 1).toUpperCase() + msg.substring(1);
        System.out.println("过滤器2,大写首字母,执行结果:"+s);
        return s;
    }
}

封装初始化过程

public class InitializeHanler {
    /**
     * 责任链头部
     */
    private static  Handler firstHandler;

    /**
     * 将拦截器实例添加
     *
     * @param hanlers
     * @param <T>
     */
    public  static  <T extends Handler> void buildHandlerChain(T... hanlers) {
        for (T t : hanlers) {
            if(null==firstHandler){
                firstHandler=t;
            }
            Handler.addHandler(t);
        }
        Handler.loadHandler();
    }

    /**
     * 从头部开始执行责任链
     *
     * @param msg
     */
    public static void doHandle(String msg){
        firstHandler.doHanle(msg);
    }

}

配置

@Configuration
public class Config {
    @Bean
    public void Init(){
        InitializeHanler.buildHandlerChain(addIntercepter1(),addIntercepter2());
        System.out.println("拦截器初始化构建完成");
    }

    @Bean
    public Intercepter addIntercepter1(){
        return new Intercepter();
    }

    @Bean
    public Intercepter2 addIntercepter2(){
        return new Intercepter2();
    }
}

测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

	@Test
	public void contextLoads() {
		InitializeHanler.doHandle("AJSDBASB");
	}

}

测试结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值