责任链设计模式

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

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

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

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

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

一种简单的方式是直接通过 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);  // 依次执行所有的过滤器
    }
}
相关推荐
Query*2 小时前
Java 设计模式——建造者模式:从原理到实战的极简指南
java·设计模式·建造者模式
Tiny_React4 小时前
智能体设计模式-CH05:工具使用(Tool Use)
设计模式
舒克起飞了4 小时前
设计模式——建造者模式
设计模式·建造者模式
Tiny_React4 小时前
智能体设计模式-CH06:规划(Planning)
设计模式
Meteors.6 小时前
23种设计模式——迭代器模式 (Iterator Pattern)详解
java·设计模式·迭代器模式
Tiny_React7 小时前
智能体设计模式-CH03:并行化(Parallelization)
设计模式
Tiny_React7 小时前
智能体设计模式-CH02:路由(Routing)
设计模式
Deschen7 小时前
设计模式-组合模式
java·设计模式·组合模式
Tiny_React9 小时前
智能体设计模式-CH01:提示链(Prompt Chaining)
设计模式
Asort10 小时前
JavaScript设计模式(十五)——解释器模式 (Interpreter)
前端·javascript·设计模式