责任链设计模式

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

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

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

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

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

一种简单的方式是直接通过 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);  // 依次执行所有的过滤器
    }
}
相关推荐
nnsix16 小时前
设计模式 - 建造者模式 笔记
笔记·设计模式·建造者模式
cui178756817 小时前
矩阵拼团 + 复购拼团:新零售最稳的复购模式,规则简单
大数据·人工智能·设计模式·零售
百珏17 小时前
[灰度发布]:全链路透传组件:APM、自研方案与 Java Agent 的实现取舍
后端·设计模式·架构
likerhood19 小时前
设计模式 · 享元模式(Flyweight Pattern)java
java·设计模式·享元模式
AI大法师19 小时前
从 Adobe 焕新看品牌系统升级:Logo、主色、字体与产品体验如何重新对齐
大数据·人工智能·adobe·设计模式
贵慜_Derek20 小时前
《从零实现 Agent 系统》连载 03|控制循环:感知—决策—行动—反思
人工智能·设计模式·架构
nnsix21 小时前
设计模式 - 原型模式 笔记
笔记·设计模式·原型模式
nnsix21 小时前
设计模式 - 适配器模式 笔记
笔记·设计模式·适配器模式
asdfg125896321 小时前
一文理解软件开发中的“设计模式”
java·设计模式·软件开发
云飞云共享云桌面1 天前
SolidWorks 服务器通过云飞云共享云桌面10人研发共享方案
运维·服务器·3d·设计模式·电脑