在职责链模式中,多个处理器(也就是“接收对象”)依次处理同一个请求。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B 处理器处理完后再传递给 C 处理器,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责,所以叫作职责链模式

应用:过滤敏感词

对于支持 UGC(User Generated Content,用户生成内容)的应用(比如论坛)来说,用户生成的内容(比如,在论坛中发表的帖子)可能会包含一些敏感词(比如涉黄、广告、反动等词汇)。针对这个应用场景,我们就可以利用职责链模式来过滤这些敏感词。

  1. public interface SensitiveWordFilter {
  2. boolean doFilter(Content content);
  3. }
  4. public class SexyWordFilter implements SensitiveWordFilter {
  5. @Override
  6. public boolean doFilter(Content content) {
  7. boolean legal = true;
  8. //...
  9. return legal;
  10. }
  11. }
  12. // PoliticalWordFilter、AdsWordFilter类代码结构与SexyWordFilter类似
  13. public class SensitiveWordFilterChain {
  14. private List<SensitiveWordFilter> filters = new ArrayList<>();
  15. public void addFilter(SensitiveWordFilter filter) {
  16. this.filters.add(filter);
  17. }
  18. // return true if content doesn't contain sensitive words.
  19. public boolean filter(Content content) {
  20. for (SensitiveWordFilter filter : filters) {
  21. if (!filter.doFilter(content)) {
  22. return false;
  23. }
  24. }
  25. return true;
  26. }
  27. }
  28. public class ApplicationDemo {
  29. public static void main(String[] args) {
  30. SensitiveWordFilterChain filterChain = new SensitiveWordFilterChain();
  31. filterChain.addFilter(new AdsWordFilter());
  32. filterChain.addFilter(new SexyWordFilter());
  33. filterChain.addFilter(new PoliticalWordFilter());
  34. boolean legal = filterChain.filter(new Content());
  35. if (!legal) {
  36. // 不发表
  37. } else {
  38. // 发表
  39. }
  40. }
  41. }