责任链设计模式

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

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

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

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

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

一种简单的方式是直接通过 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);  // 依次执行所有的过滤器
    }
}
相关推荐
Zane19944 天前
一个 new 就能创建对象,为什么还要拆出单例、工厂、建造者、原型四种模式?
设计模式
怕浪猫5 天前
一行命令复刻爆款视频,我把 Hypit 从安装跑到了出片
人工智能·设计模式·程序员
Zane19945 天前
函数式编程里的函数,其实不是你天天写的那个函数——三大编程范式的边界在哪
设计模式
Zane19946 天前
策略模式现在该不该上?一次讲清楚过度设计和设计不足怎么找平衡
设计模式
她说..6 天前
常见设计模式-模板方法模式
java·spring·设计模式·springboot
xiaofeiyang1506 天前
第六章 · 桥接 — 三支毛笔,画出九种颜色
设计模式
Shadow(⊙o⊙)7 天前
OTOL设计模式 One Thread One Loop
服务器·网络·设计模式
sarasuki7 天前
如何让LLM 能在半夜偷偷打开网易云呢?
人工智能·设计模式·agent
小王师傅668 天前
【设计模式】装饰模式(四):框架源码实战——从 Java I/O 到 Spring 到 MyBatis
java·设计模式
执明wa8 天前
Android RecyclerView 多类型, 多种 Item
android·xml·开发语言·设计模式·android studio