责任链其实就是依次执行多个过滤器,最终拿到想要的结果。
下面我用一个例子来讲解:
从简单的代码开始理解责任链模式
我们先用一个简单的例子来帮助大家理解责任链模式。
假设我们有一些杂物(小米、红豆、黄豆),我们想要在这些杂物中只保留"黄豆",那么就需要过滤掉"小米"和"红豆"。
一种简单的方式是直接通过 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); // 依次执行所有的过滤器
}
}