责任链设计模式

责任链其实就是依次执行多个过滤器,最终拿到想要的结果。

下面我用一个例子来讲解:

从简单的代码开始理解责任链模式

我们先用一个简单的例子来帮助大家理解责任链模式。

假设我们有一些杂物(小米、红豆、黄豆),我们想要在这些杂物中只保留"黄豆",那么就需要过滤掉"小米"和"红豆"。

一种简单的方式是直接通过 if 条件语句来判断和过滤,代码如下:

java 复制代码
public class Request {
    private String data;

    public String getData() {
        return data;
    }
    
    public void setData(String data) {
        this.data = data;
    }
}

public class Handler {

    public void handlerRequest(Request request) {
        String data = request.getData();

        if (data.contains("小米")) {
            filterXiaoMi(data);
        }
        if (data.contains("红豆")) {
            filterHongDou(data);
        }
        // 通过上面的代码,最终可以得到黄豆
    }

    private void filterXiaoMi(String data) {
        // 过滤小米
    }

    private void filterHongDou(String data) {
        // 过滤红豆
    }
}

这个实现看起来简单直白,但问题在于每次有新需求时,我们需要修改 handlerRequest 方法,增加更多的 if 语句,导致代码不断膨胀。

责任链模式的优雅解决方案

如果产品经理有新的需求,要过滤"白米","黄豆"或者"绿豆",那么代码会变得更加复杂。假设我们这样修改:

java 复制代码
public class Handler {

    public void handlerRequest(Request request) {
        String data = request.getData();

        if (data.contains("小米")) {
            filterXiaoMi(data);
        }
        if (data.contains("红豆")) {
            filterHongDou(data);
        }
        if (data.contains("白米")) {
            filterBaiMi(data);
        }
        if (data.contains("黄豆")) {
            filterHuangDou(data);
        }
        if (data.contains("绿豆")) {
            filterLvDou(data);
        }
    }

    private void filterLvDou(String data) {
        // 过滤绿豆
    }

    private void filterHuangDou(String data) {
        // 过滤黄豆
    }

    private void filterBaiMi(String data) {
        // 过滤白米
    }

    private void filterHongDou(String data) {
        // 过滤红豆
    }

    private void filterXiaoMi(String data) {
        // 过滤小米
    }
}

看得出来,当需求复杂或者变动较大时,代码变得越来越难以维护,因为每次都要修改 handlerRequest 的逻辑,新增、修改或删除过滤条件。这个问题,责任链模式可以优雅地解决。

责任链模式实现

为了优雅地处理这一系列过滤操作,我们将每个过滤条件提取到单独的类中,每个类只负责一种过滤操作,并且通过责任链模式将这些操作串联起来。代码如下:

首先,我们定义一个 Filter 接口,并为每个过滤条件实现该接口:

java 复制代码
public interface Filter {
    void doFilter(String data);
}

class FilterXiaoMi implements Filter {
    @Override
    public void doFilter(String data) {
        // 过滤小米
    }
}

class FilterHongDou implements Filter {
    @Override
    public void doFilter(String data) {
        // 过滤红豆
    }
}

class FilterBaiMi implements Filter {
    @Override
    public void doFilter(String data) {
        // 过滤白米
    }
}

class FilterHuangDou implements Filter {
    @Override
    public void doFilter(String data) {
        // 过滤黄豆
    }
}

然后,我们创建一个 FilterChain 类,用来将多个 Filter 串联成一条链:

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class FilterChain {
    List<Filter> filters = new ArrayList<>();

    public FilterChain() {
        filters.add(new FilterXiaoMi());
        filters.add(new FilterHongDou());
        filters.add(new FilterBaiMi());
        filters.add(new FilterHuangDou());
    }

    public void processData(String data) {
        for (Filter filter : filters) {
            filter.doFilter(data);
        }
    }
}

最后,我们的 Handler 类就变得简单多了,只需要创建 FilterChain 对象,并调用 processData 方法即可:

java 复制代码
public class Handler {
    public void handlerRequest(Request request) {
        String data = request.getData();
        FilterChain filterChain = new FilterChain();
        filterChain.processData(data);  // 依次执行所有的过滤器
    }
}
相关推荐
成钰28 分钟前
设计模式之单例模式:一个类就只有一个实例
单例模式·设计模式
o0向阳而生0o29 分钟前
110、23种设计模式之状态模式(19/23)
设计模式·状态模式
_院长大人_36 分钟前
设计模式-单例模式
单例模式·设计模式
崎岖Qiu10 小时前
【设计模式笔记17】:单例模式1-模式分析
java·笔记·单例模式·设计模式
安冬的码畜日常15 小时前
【JUnit实战3_27】第十六章:用 JUnit 测试 Spring 应用:通过实战案例深入理解 IoC 原理
spring·观察者模式·设计模式·单元测试·ioc·依赖注入·junit5
她说彩礼65万17 小时前
C#设计模式 单例模式实现方式
单例模式·设计模式·c#
安冬的码畜日常20 小时前
【JUnit实战3_28】第十七章:用 JUnit 5 实测 SpringBoot 项目
spring boot·功能测试·测试工具·设计模式·单元测试·junit5
围巾哥萧尘21 小时前
TRAE Agent 歌曲创作助手构建与使用教程🧣
设计模式
superman超哥21 小时前
仓颉语言中流式I/O的设计模式深度剖析
开发语言·后端·设计模式·仓颉
m0_748248021 天前
Spring设计模式刨根问底
java·spring·设计模式