职责链模式
定义
将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。
多个处理器依次处理同一个请求。一个请求先经过A处理器处理,然后再把请求传递给B处理器,B处理完后传递给C,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责。职责链模式实现有多种。
类图
实现
实现一个敏感词过滤。
1. 定义过滤算法接口
public interface SensitiveWordFilter {
boolean doFilter(Content content);
}
2. 定义过滤算法实现类
/**
* 敏感词过滤一
*/
public class SexyWordFilter implements SensitiveWordFilter{
@Override
public boolean doFilter(Content content) {
if (content.content.contains("性")) {
return false;
}
return true;
}
}
/**
* 敏感词过滤二
*/
public class PoliticalWorldFilter implements SensitiveWordFilter{
@Override
public boolean doFilter(Content content) {
if (content.content.contains("政治")) {
return false;
}
return true;
}
}
3. 创建Filter Chain
/**
* 通过集合保存过滤算法
* 暴露filter执行敏感词过滤。这只是其中的职责链的变种。
*/
public class SenstiveWordFilterChain {
private List<SensitiveWordFilter> filterList = new ArrayList<>();
public void addWordFilter(SensitiveWordFilter filter) {
this.filterList.add(filter);
}
public boolean filter(Content content) {
for (SensitiveWordFilter sensitiveWordFilter : filterList) {
if (!sensitiveWordFilter.doFilter(content)) {
return false;
}
}
return true;
}
}
4. Main
/**
* 1. 职责链模式很好体现单一职责原则。业务逻辑判断 设计成独立的类,通过接口方便扩展。
* 2. 职责链模式也体现开闭原则。如果需要新添加过滤算法,我们只需要实现Filter接口,并通过addWordFitler添加到职责链即可。其它代码不需要修改,进而提高代码的扩展性。
*/
public class M {
public static void main(String[] args) {
SenstiveWordFilterChain senstiveWordFilterChain = new SenstiveWordFilterChain();
senstiveWordFilterChain.addWordFilter(new PoliticalWorldFilter());
senstiveWordFilterChain.addWordFilter(new SexyWordFilter());
Content content = new Content();
content.content = "2333";
boolean filter = senstiveWordFilterChain.filter(content);
if (filter) {
System.out.println("可以正常发布");
} else {
System.out.println("不允许发布。因为包含敏感信息!");
}
}
}
总结
- 职责链很好地符合
单一职责原则(每个算法都是独立的实现)
和开闭原则(扩展算法不需要修改其他代码,只需要修改客户端代码。也可以在类中做标记,比如实现某个标记接口,然后通过Spring的Bean扫描并装载到职责链内)
- 职责链本意是依次处理同一个请求,用户可以自定义该请求是否需要经历所有处理器,不会中途停止; 还是说当某个处理器有能力处理请求就完成职责链对该请求的处理。
- 职责链具有
复用
和扩展
能力。在实际的项目开发中比较常用。