Java设计模式---ChainOfResponsibility责任链模式
参考于 :
大话设计模式
马士兵设计模式视频
代码参考于马士兵设计模式视频
写在开头:职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系
图来自大话设计模式,下面我的代码中,Clien是t依赖于Handler1和Handler2的,不过可以使用配置文件或者直接给Filter集合初始化来解决这种依赖。

1.场景
在网上评论一句话,往往会经过一系列的处理,有没有敏感词之类,现在我们来模拟一下。
把<html>,o.o,和谐
换成 [html],^v^,/*河蟹*/
2.不使用职责链模式
package com.dingyu.ChainOfResponsibility; /**
* 重点在于模式,故逻辑暂时不考虑
*
* @author dingyu
*
*/
public class Client01 {
public static void main(String[] args) {
String s = "<html>,o.o,和谐";
s = s.replace("<", "[").replace(">", "]").replace("和谐", "/*河蟹*/").replace("o.o", "^v^");
System.out.println(s);
}
}
缺点:过滤无法复用,无法记录过滤顺序。
3.使用职责链模式
package com.dingyu.ChainOfResponsibility;
/**
* 过滤器,doFilter处理msg字符串
* @author dingyu
*
*/
public interface Filter {
public String doFilter(String msg);
}
package com.dingyu.ChainOfResponsibility; /**
* 处理html符号
* 测试用的,逻辑不是很严谨
* @author dingyu
*
*/
public class HTMLFilter implements Filter { @Override
public String doFilter(String msg) {
return msg.replace("<", "[").replace(">", "]");
} }
package com.dingyu.ChainOfResponsibility;
/**
* 过滤敏感词汇
* @author dingyu
*
*/
public class SensitiveWordFilter implements Filter { @Override
public String doFilter(String msg) {
return msg.replace("和谐", "/*河蟹*/");
} }
package com.dingyu.ChainOfResponsibility;
/**
* 处理符号
* @author dingyu
*
*/
public class SymbolFilter implements Filter { @Override
public String doFilter(String msg) {
return msg.replace("o.o", "^v^");
} }
package com.dingyu.ChainOfResponsibility; import java.util.ArrayList;
import java.util.List; public class Client {
private static List<Filter> filters = new ArrayList<Filter>();
private static int index = 0; public static void main(String[] args) {
String s = "<html>,o.o,和谐";
filters.add(new HTMLFilter());
filters.add(new SymbolFilter());
filters.add(new SensitiveWordFilter());
for (Filter filter : filters) {
s = filter.doFilter(s);
}
System.out.println(s);
}
}
虽然使用职责链模式,但仍然有缺点,上面的顺序是先HTML,然后Symbol,最后SensitiveWord,这三个构成一个过滤链条,如果有一天我需要把另一个过滤链条插入到这根链条中间,实现起来很麻烦。
4.改进职责链模式
package com.dingyu.ChainOfResponsibility; import java.util.ArrayList;
import java.util.List;
/**
*
* @author dingyu
*
*/
public class FilterChain implements Filter { private List<Filter> filters = new ArrayList<Filter>(); public void add(Filter filter) {
filters.add(filter);
} public List<Filter> getFilters() {
return filters;
} @Override
public String doFilter(String msg) {
for (Filter filter : filters) {
msg = filter.doFilter(msg);
}
return msg;
} }
package com.dingyu.ChainOfResponsibility; import java.util.ArrayList;
import java.util.List; public class Client {
// private static List<Filter> filters = new ArrayList<Filter>(); public static void main(String[] args) {
String s = "<html>,o.o,和谐";
// 链条1
FilterChain chain1 = new FilterChain();
chain1.add(new HTMLFilter());
// 链条2
FilterChain chain2 = new FilterChain();
chain2.add(new HTMLFilter());
chain2.add(new SensitiveWordFilter());
// 链条2插到链条1后
chain1.add(chain2);
chain1.add(new SymbolFilter());
s = chain1.doFilter(s);
System.out.println(s);
// filters.add(new HTMLFilter());
// filters.add(new SymbolFilter());
// filters.add(new SensitiveWordFilter());
// for (Filter filter : filters) {
// s = filter.doFilter(s);
// }
// System.out.println(s);
}
}
建议debug , eclipse快捷键

5. 职责链实现双向过滤
思路类似于递归,建议使用debug一步步调试。

package com.dingyu.ChainOfResponsibility; /**
* 过滤器,doFilter处理msg字符串
*
* @author dingyu
*
*/
public interface Filter {
// public String doFilter(String msg);
public void doFilter(Request request, Reponse reponse, FilterChain filterChain);
}
package com.dingyu.ChainOfResponsibility; /**
* 处理html符号 测试用的,逻辑不是很严谨
*
* @author dingyu
*
*/
public class HTMLFilter implements Filter { @Override
public void doFilter(Request request, Reponse reponse, FilterChain filterChain) {
request.getRequestMsg().replace("<", "[").replace(">", "]");
filterChain.doFilter(request, reponse, filterChain);
reponse.setReponseMsg(reponse.getReponseMsg() + "-----HTMLFilter");
} // @Override
// public String doFilter(String msg) {
// return msg.replace("<", "[").replace(">", "]");
// } }
package com.dingyu.ChainOfResponsibility; /**
* 过滤敏感词汇
*
* @author dingyu
*
*/
public class SensitiveWordFilter implements Filter { @Override
public void doFilter(Request request, Reponse reponse, FilterChain filterChain) {
request.getRequestMsg().replace("和谐", "/*河蟹*/");
filterChain.doFilter(request, reponse, filterChain);
reponse.setReponseMsg(reponse.getReponseMsg() + "-----SensitiveWordFilter");
} // @Override
// public String doFilter(String msg) {
// return msg.replace("和谐", "/*河蟹*/");
// } }
package com.dingyu.ChainOfResponsibility; /**
* 处理符号
*
* @author dingyu
*
*/
public class SymbolFilter implements Filter { @Override
public void doFilter(Request request, Reponse reponse, FilterChain filterChain) {
request.getRequestMsg().replace("o.o", "^v^");
filterChain.doFilter(request, reponse, filterChain);
reponse.setReponseMsg(reponse.getReponseMsg() + "-----SymbolFilter");
} // @Override
// public String doFilter(String msg) {
// return msg.replace("o.o", "^v^");
// } }
package com.dingyu.ChainOfResponsibility; import java.util.ArrayList;
import java.util.List; /**
*
* @author dingyu
*
*/
public class FilterChain implements Filter { private List<Filter> filters = new ArrayList<Filter>();
private int index=-1; public void add(Filter filter) {
filters.add(filter);
} public List<Filter> getFilters() {
return filters;
} // @Override
// public String doFilter(String msg) {
// for (Filter filter : filters) {
// msg = filter.doFilter(msg);
// }
// return msg;
// } @Override
public void doFilter(Request request, Reponse reponse, FilterChain filterChain) {
if (index == filters.size()-1)
return;
index++;
filters.get(index).doFilter(request, reponse, filterChain); } }
package com.dingyu.ChainOfResponsibility;
public class Client03 {
public static void main(String[] args) {
Request request = new Request();
Reponse reponse = new Reponse();
request.setRequestMsg("<html>,o.o,和谐");
reponse.setReponseMsg("hahahahaha");
FilterChain chain = new FilterChain();
chain.add(new HTMLFilter());
chain.add(new SensitiveWordFilter());
chain.add(new SymbolFilter());
chain.doFilter(request, reponse, chain);
System.out.println(request.getRequestMsg());
System.out.println(reponse.getReponseMsg());
}
}
Java设计模式---ChainOfResponsibility责任链模式的更多相关文章
- 详解java设计模式之责任链模式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...
- Java设计模式之责任链模式、职责链模式
本文继续介绍23种设计模式系列之职责链模式. 什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组. 职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间 ...
- JAVA设计模式之责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- Java设计模式之八 ----- 责任链模式和命令模式
前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...
- Java设计模式应用——责任链模式
生产一个产品,需要依次执行多个步骤,才能完成,那么是使用责任链模式则是极好的. 在性能告警模块开发过程中,创建一条告警规则需要执行阈值解析,中间表生成,流任务生成,规则入库,告警事件入库等诸多操作.如 ...
- java设计模式之责任链模式(Chain of Responsibility)
转自:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的<JAVA与模式>一书中开头是这样 ...
- java设计模式之责任链模式以及在java中作用
责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个 ...
- 击鼓传花联想到了Java设计模式:责任链模式
目录 应用场景 简单示例 责任链模式 定义 意图 主要解决问题 何时使用 优缺点 击鼓传花的故事 应用场景 http web请求处理,请求过来后将经过转码.解析.参数封装.鉴权等一系列的处理(责任), ...
- 【java设计模式】责任链模式
可以随时添加过滤器,并在主方法中添加删除: Main package com.tn.filter; public class Main { public static void main(String ...
随机推荐
- 从壹开始微服务 [ DDD ] 之十二 ║ 核心篇【下】:事件驱动EDA 详解
缘起 哈喽大家好,又是周二了,时间很快,我的第二个系列DDD领域驱动设计讲解已经接近尾声了,除了今天的时间驱动EDA(也有可能是两篇),然后就是下一篇的事件回溯,就剩下最后的权限验证了,然后就完结了, ...
- SpringBoot进阶教程(二十五)整合Redis之@Cacheable、@CachePut、@CacheEvict的应用
在上一篇文章(<SpringBoot(二十四)整合Redis>)中,已经实现了Spring Boot对Redis的整合,既然已经讲到Cache了,今天就介绍介绍缓存注解.各家互联网产品现在 ...
- layui选项卡同步问题
下面这些代码是在有选项卡的情况下, 一个页面的状态修改时打开另一个选项卡, 另一个选项卡修改成功后,可以使你当前的选项卡状态实时更新 // 重载当前的页面的需要刷新的表格 table.reload(' ...
- WordPress怎样设置菜单栏旋转小图标
最近我在浏览别的博客的文章时,无意间发现了一个很好看的小装饰.那就是在WordPress菜单栏上的小图标.于是我研究了研究,弄到了设置方法之后决定把它分享出来. 菜单栏的小图标 设置步骤: 1, 我们 ...
- CODING 敏捷实践完全指南
你好,欢迎使用 CODING! 这份最佳实践将帮助你掌握 CODING 敏捷管理工具,更好地实践敏捷开发流程. 更多实践案例持续更新中 什么是敏捷研发 敏捷研发是涉及整个软件工程的理念与实践,它的核心 ...
- iOS----------Mac维修预约-如何找到电脑维修单
先打开苹果官网,找到技术支持 2.选择维修选项 3.查看维修状态 4.显示维修时间订单
- mysql7笔记----遍历节点所有子节点
mysql遍历节点的所有子节点 DELIMITER // CREATE FUNCTION `getChildrenList`(rootId INT) ) BEGIN ); ); SET sTemp = ...
- 第一周Python学习笔记
Python 基本语法: ① Python程序的格式:1.用代码高亮来标识函数丶语句等等 本身的代码高亮并没有实际的意义,只是用来辅助编程人员和阅读人员 更好的识别 2.程序以缩进来标识语句,缩进用 ...
- React 基础入门
React 起源于 Facebook 内部项目,是一个用来构建用户界面的 Javascript 库,相当于MVC架构中的V层框架,与市面上其他框架不同的是,React 把每一个组件当成了一个状态机,组 ...
- 探究 CSS 混合模式\滤镜导致 CSS 3D 失效问题
今天在写一个小的 CSS Demo,一个关于 3d 球的旋转动画,关于 CSS 3D,少不了会使用下面这几个属性: { transform-style: preserve-3d; perspectiv ...