责任链设计模式

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

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

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

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

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

一种简单的方式是直接通过 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);  // 依次执行所有的过滤器
    }
}
相关推荐
mjr1 小时前
设计模式-Java
java·设计模式
yuanpan1 小时前
23种设计模式之《组合模式(Composite)》在c#中的应用及理解
开发语言·设计模式·c#·组合模式
FLZJ_KL3 小时前
【设计模式】【创建型模式】单例模式(Singleton)
java·单例模式·设计模式
万兴丶5 小时前
Unity 适用于单机游戏的红点系统(前缀树 | 数据结构 | 设计模式 | 算法 | 含源码)
数据结构·unity·设计模式·c#
菜鸟一枚在这6 小时前
深入剖析抽象工厂模式:设计模式中的架构利器
设计模式·架构·抽象工厂模式
码熔burning6 小时前
(三)趣学设计模式 之 抽象工厂模式!
设计模式·抽象工厂模式
程序猿多布7 小时前
C#设计模式 学习笔记
设计模式·c#
強云11 小时前
23种设计模式 - 模板方法
设计模式·模板方法
workflower17 小时前
Prompt Engineering的重要性
大数据·人工智能·设计模式·prompt·软件工程·需求分析·ai编程
ox008020 小时前
C++ 设计模式-中介者模式
c++·设计模式·中介者模式