责任链模式是干什么用的?
避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
具体使用的场景
- 多个对象可以同时处理同一个请求
- 可动态指定一组对象处理请求
优点
- 降低耦合,将请求的发送者和接收者解耦
- 简化了对象,使得对象不需要知道链的结构
- 增强给对象指派责任的灵活性,可以通过改变链内的成员的调用顺序,允许动态的新增和删除责任
- 增加新的请求处理列比较方便
缺点
- 多个对象可以同时处理同一个对象,具体那个对象处理该请求需要在运行的时候才能确定
- 在不确定接收者的情况下,向多个对象中的一个提交一个请求
实现
定义Filter接口
public interface Filter {
void doFilter(Set<String> strings);
}
定义AppleFilter实现Filter
public class AppleFilter implements Filter {
@Override
public void doFilter(Set<String> strings) {
if (strings.contains("apple")){
strings.remove("apple");
}
}
}
定义BananaFilter实现Filter
public class BananaFilter implements Filter {
@Override
public void doFilter(Set<String> strings) {
if (strings.contains("banana")){
strings.remove("banana");
}
}
}
定义FilterChain
public class FilterChain {
List<Filter> filters = new ArrayList<>();
public FilterChain(){
filters.add(new AppleFilter());
filters.add(new BananaFilter());
}
public void processData(Set<String> strings){
for (Filter filter : filters){
filter.doFilter(strings);
}
}
}
测试
public class test {
public static void main(String[] args) {
Set<String> strings = new HashSet<>();;
strings.add("apple");
strings.add("banana");
strings.add("orange");
FilterChain chain = new FilterChain();
chain.processData(strings);
System.out.println(strings.toString());
}
}