参考于 :

  大话设计模式

  马士兵设计模式视频

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

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

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

  

1.场景

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

  把<html>,o.o,和谐

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

2.不使用职责链模式

  

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

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

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

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

4.改进职责链模式

  

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

  建议debug , eclipse快捷键

5. 职责链实现双向过滤  

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

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

Java设计模式---ChainOfResponsibility责任链模式的更多相关文章

  1. 详解java设计模式之责任链模式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...

  2. Java设计模式之责任链模式、职责链模式

    本文继续介绍23种设计模式系列之职责链模式.   什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组.   职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间 ...

  3. JAVA设计模式之责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  4. Java设计模式之八 ----- 责任链模式和命令模式

    前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...

  5. Java设计模式应用——责任链模式

    生产一个产品,需要依次执行多个步骤,才能完成,那么是使用责任链模式则是极好的. 在性能告警模块开发过程中,创建一条告警规则需要执行阈值解析,中间表生成,流任务生成,规则入库,告警事件入库等诸多操作.如 ...

  6. java设计模式之责任链模式(Chain of Responsibility)

    转自:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的<JAVA与模式>一书中开头是这样 ...

  7. java设计模式之责任链模式以及在java中作用

    责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个 ...

  8. 击鼓传花联想到了Java设计模式:责任链模式

    目录 应用场景 简单示例 责任链模式 定义 意图 主要解决问题 何时使用 优缺点 击鼓传花的故事 应用场景 http web请求处理,请求过来后将经过转码.解析.参数封装.鉴权等一系列的处理(责任), ...

  9. 【java设计模式】责任链模式

    可以随时添加过滤器,并在主方法中添加删除: Main package com.tn.filter; public class Main { public static void main(String ...

随机推荐

  1. 自己动手编译Android(LineageOS)源码

    准备 设备:红米3s 设备代号:land Android版本:7.1.1 源码提供:Lineage PC配置: 系统:Ubuntu16.04 x64 至少12G RAM 至少80GB 剩余硬盘空间 良 ...

  2. mpvue 小程序开发爬坑汇总

    <!-- 小程序的爬坑记录 --> 1 微信小程序之动态获取元素宽高 var obj=wx.createSelectorQuery(); 2 微信小程序图片自适应 <image cl ...

  3. Python调用ansible API系列(四)动态生成hosts文件

    方法一:通过最原始的操作文件的方式 #!/usr/bin/env python # -*- coding: utf-8 -*- """ 通过操作文件形式动态生成ansib ...

  4. 关于数据库管理系统DBMS--关系型数据库(MySQL/MariaDB)

    数据库的结构(3种):层次,网状,关系型(用的最多): DBMS的三层模型: 视图层:面向最终用户: 逻辑层:面向程序员或DBA: 物理层:面向系统管理员: 关系型数据库管理系统——RDBMS: 主要 ...

  5. vue之$root,$parent

    $root vue状态管理使用vuex,如果项目不大,逻辑不多,name我们没必要用vuex给项目增加难度,只需要用$root设置vue实例的data就行了,如下 main.js new Vue({ ...

  6. 实验二 request、out对象使用

    request.out对象使用 一.实验目的 1.掌握代码片段中的注释的应用: 2.掌握JSP脚本标示---Java代码片段的应用. 二.实验内容 1.设计教师与学生不同登陆界面,如下图: 2.验证码 ...

  7. openlayers4 入门开发系列之地图标绘篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  8. 关于ORACLE的SQL语句拼接、替换、截取、排序,联表等...~持续汇总~

     先看一下所有的数据.这里全部为VARCHAR2(255). 字段拼接 在所有的性别后面加% 字段替换,把性别TPF_SEX去除百分号% 字段截取 字段截取+拼接 字段替换,这里把百分号%替换为空,也 ...

  9. 第九周LINUX 学习笔记

    基于GTID的mysql主从简单复制 一.简单主从模式配置步骤1.配置主从节点的服务配置文件1.1.配置master节点:[mysqld]binlog-format=ROWlog-bin=master ...

  10. vue 对列表数组删除和增加

    很重要,一定要好好研究 https://cn.vuejs.org/v2/guide/list.html#%E6%9B%BF%E6%8D%A2%E6%95%B0%E7%BB%84