经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
Java设计模式---ChainOfResponsibility责任链模式
来源:cnblogs  作者:DingYu  时间:2018/11/29 9:23:41  对本文有异议

参考于 :

  大话设计模式

  马士兵设计模式视频

  代码参考于马士兵设计模式视频

  写在开头:职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系

  图来自大话设计模式,下面我的代码中,Clien是t依赖于Handler1和Handler2的,不过可以使用配置文件或者直接给Filter集合初始化来解决这种依赖。

  

 

1.场景

  在网上评论一句话,往往会经过一系列的处理,有没有敏感词之类,现在我们来模拟一下。

  把<html>,o.o,和谐

  换成 [html],^v^,/*河蟹*/

2.不使用职责链模式

  

  1. package com.dingyu.ChainOfResponsibility;
  2. /**
  3. * 重点在于模式,故逻辑暂时不考虑
  4. *
  5. * @author dingyu
  6. *
  7. */
  8. public class Client01 {
  9. public static void main(String[] args) {
  10. String s = "<html>,o.o,和谐";
  11. s = s.replace("<", "[").replace(">", "]").replace("和谐", "/*河蟹*/").replace("o.o", "^v^");
  12. System.out.println(s);
  13. }
  14. }

  缺点:过滤无法复用,无法记录过滤顺序。

3.使用职责链模式

  

  1. package com.dingyu.ChainOfResponsibility;
  2. /**
  3. * 过滤器,doFilter处理msg字符串
  4. * @author dingyu
  5. *
  6. */
  7. public interface Filter {
  8. public String doFilter(String msg);
  9. }
  1. package com.dingyu.ChainOfResponsibility;
  2. /**
  3. * 处理html符号
  4. * 测试用的,逻辑不是很严谨
  5. * @author dingyu
  6. *
  7. */
  8. public class HTMLFilter implements Filter {
  9. @Override
  10. public String doFilter(String msg) {
  11. return msg.replace("<", "[").replace(">", "]");
  12. }
  13. }
  1. package com.dingyu.ChainOfResponsibility;
  2. /**
  3. * 过滤敏感词汇
  4. * @author dingyu
  5. *
  6. */
  7. public class SensitiveWordFilter implements Filter {
  8. @Override
  9. public String doFilter(String msg) {
  10. return msg.replace("和谐", "/*河蟹*/");
  11. }
  12. }
  1. package com.dingyu.ChainOfResponsibility;
  2. /**
  3. * 处理符号
  4. * @author dingyu
  5. *
  6. */
  7. public class SymbolFilter implements Filter {
  8. @Override
  9. public String doFilter(String msg) {
  10. return msg.replace("o.o", "^v^");
  11. }
  12. }
  1. package com.dingyu.ChainOfResponsibility;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class Client {
  5. private static List<Filter> filters = new ArrayList<Filter>();
  6. private static int index = 0;
  7. public static void main(String[] args) {
  8. String s = "<html>,o.o,和谐";
  9. filters.add(new HTMLFilter());
  10. filters.add(new SymbolFilter());
  11. filters.add(new SensitiveWordFilter());
  12. for (Filter filter : filters) {
  13. s = filter.doFilter(s);
  14. }
  15. System.out.println(s);
  16. }
  17. }

  虽然使用职责链模式,但仍然有缺点,上面的顺序是先HTML,然后Symbol,最后SensitiveWord,这三个构成一个过滤链条,如果有一天我需要把另一个过滤链条插入到这根链条中间,实现起来很麻烦。

4.改进职责链模式

  

  1. package com.dingyu.ChainOfResponsibility;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. /**
  5. *
  6. * @author dingyu
  7. *
  8. */
  9. public class FilterChain implements Filter {
  10. private List<Filter> filters = new ArrayList<Filter>();
  11. public void add(Filter filter) {
  12. filters.add(filter);
  13. }
  14. public List<Filter> getFilters() {
  15. return filters;
  16. }
  17. @Override
  18. public String doFilter(String msg) {
  19. for (Filter filter : filters) {
  20. msg = filter.doFilter(msg);
  21. }
  22. return msg;
  23. }
  24. }
  1. package com.dingyu.ChainOfResponsibility;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class Client {
  5. // private static List<Filter> filters = new ArrayList<Filter>();
  6.  
  7. public static void main(String[] args) {
  8. String s = "<html>,o.o,和谐";
  9. // 链条1
  10. FilterChain chain1 = new FilterChain();
  11. chain1.add(new HTMLFilter());
  12. // 链条2
  13. FilterChain chain2 = new FilterChain();
  14. chain2.add(new HTMLFilter());
  15. chain2.add(new SensitiveWordFilter());
  16. // 链条2插到链条1后
  17. chain1.add(chain2);
  18. chain1.add(new SymbolFilter());
  19. s = chain1.doFilter(s);
  20. System.out.println(s);
  21. // filters.add(new HTMLFilter());
  22. // filters.add(new SymbolFilter());
  23. // filters.add(new SensitiveWordFilter());
  24. // for (Filter filter : filters) {
  25. // s = filter.doFilter(s);
  26. // }
  27. // System.out.println(s);
  28. }
  29. }

  建议debug , eclipse快捷键

5. 职责链实现双向过滤  

  思路类似于递归,建议使用debug一步步调试。

  1. package com.dingyu.ChainOfResponsibility;
  2. /**
  3. * 过滤器,doFilter处理msg字符串
  4. *
  5. * @author dingyu
  6. *
  7. */
  8. public interface Filter {
  9. // public String doFilter(String msg);
  10. public void doFilter(Request request, Reponse reponse, FilterChain filterChain);
  11. }
  1. package com.dingyu.ChainOfResponsibility;
  2. /**
  3. * 处理html符号 测试用的,逻辑不是很严谨
  4. *
  5. * @author dingyu
  6. *
  7. */
  8. public class HTMLFilter implements Filter {
  9. @Override
  10. public void doFilter(Request request, Reponse reponse, FilterChain filterChain) {
  11. request.getRequestMsg().replace("<", "[").replace(">", "]");
  12. filterChain.doFilter(request, reponse, filterChain);
  13. reponse.setReponseMsg(reponse.getReponseMsg() + "-----HTMLFilter");
  14. }
  15. // @Override
  16. // public String doFilter(String msg) {
  17. // return msg.replace("<", "[").replace(">", "]");
  18. // }
  19. }
  1. package com.dingyu.ChainOfResponsibility;
  2. /**
  3. * 过滤敏感词汇
  4. *
  5. * @author dingyu
  6. *
  7. */
  8. public class SensitiveWordFilter implements Filter {
  9. @Override
  10. public void doFilter(Request request, Reponse reponse, FilterChain filterChain) {
  11. request.getRequestMsg().replace("和谐", "/*河蟹*/");
  12. filterChain.doFilter(request, reponse, filterChain);
  13. reponse.setReponseMsg(reponse.getReponseMsg() + "-----SensitiveWordFilter");
  14. }
  15. // @Override
  16. // public String doFilter(String msg) {
  17. // return msg.replace("和谐", "/*河蟹*/");
  18. // }
  19. }
  1. package com.dingyu.ChainOfResponsibility;
  2. /**
  3. * 处理符号
  4. *
  5. * @author dingyu
  6. *
  7. */
  8. public class SymbolFilter implements Filter {
  9. @Override
  10. public void doFilter(Request request, Reponse reponse, FilterChain filterChain) {
  11. request.getRequestMsg().replace("o.o", "^v^");
  12. filterChain.doFilter(request, reponse, filterChain);
  13. reponse.setReponseMsg(reponse.getReponseMsg() + "-----SymbolFilter");
  14. }
  15. // @Override
  16. // public String doFilter(String msg) {
  17. // return msg.replace("o.o", "^v^");
  18. // }
  19. }
  1. package com.dingyu.ChainOfResponsibility;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. /**
  5. *
  6. * @author dingyu
  7. *
  8. */
  9. public class FilterChain implements Filter {
  10. private List<Filter> filters = new ArrayList<Filter>();
  11. private int index=-1;
  12. public void add(Filter filter) {
  13. filters.add(filter);
  14. }
  15. public List<Filter> getFilters() {
  16. return filters;
  17. }
  18. // @Override
  19. // public String doFilter(String msg) {
  20. // for (Filter filter : filters) {
  21. // msg = filter.doFilter(msg);
  22. // }
  23. // return msg;
  24. // }
  25. @Override
  26. public void doFilter(Request request, Reponse reponse, FilterChain filterChain) {
  27. if (index == filters.size()-1)
  28. return;
  29. index++;
  30. filters.get(index).doFilter(request, reponse, filterChain);
  31. }
  32. }
  1. package com.dingyu.ChainOfResponsibility;
  2. public class Client03 {
  3. public static void main(String[] args) {
  4. Request request = new Request();
  5. Reponse reponse = new Reponse();
  6. request.setRequestMsg("<html>,o.o,和谐");
  7. reponse.setReponseMsg("hahahahaha");
  8. FilterChain chain = new FilterChain();
  9. chain.add(new HTMLFilter());
  10. chain.add(new SensitiveWordFilter());
  11. chain.add(new SymbolFilter());
  12. chain.doFilter(request, reponse, chain);
  13. System.out.println(request.getRequestMsg());
  14. System.out.println(reponse.getReponseMsg());
  15. }
  16. }

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号