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 ...
随机推荐
- 初探机器学习之使用讯飞TTS服务实现在线语音合成
最近在调研使用各个云平台提供的AI服务,有个语音合成的需求因此就使用了一下科大讯飞的TTS服务,也用.NET Core写了一个小示例,下面就是这个小示例及其相关背景知识的介绍. 一.什么是语音合成(T ...
- Gradle入门到实战(二) — ImageOptimization安卓图片转换压缩插件
上一篇我们了解了Gradle的各个方面,本篇介绍一款安卓图片优化转换插件,目前已在项目中使用,可一键批量转换压缩图片,webp转换与png/jpg压缩就是那么简单 GitHub项目地址:ImageOp ...
- 学习python的第二天
4.26自我总结 一.程序语言 1.机械语言 由于0和1组成 优点:执行效率快 缺点:操作麻烦繁琐 2.汇编语言 比机械语言好点 优点:比机械语言操作方便 缺点,执行慢 3.高级语言 主要两个,jav ...
- 使用Nexus3构建Docker私有镜像仓库
一.安装Nexus3 Nexus3是Sonatype提供的仓库管理平台,Nuexus Repository OSS3能够支持Maven.npm.Docker.YUM.Helm等格式数据的存储和发布:并 ...
- 2018-09-15 Java源码英翻中库以及服务原型
服务很简单, 只为演示这个库, 源码在: program-in-chinese/code_translator_service. 在Postman测试效果: 演示服务地址: 74.91.17.250: ...
- Android远程桌面助手(B1413)
ARDC(B1413) 1.解决Android9显示黑屏问题;2.解决向导菜单显示异常问题;3.解决部分手机无法正常连接的问题;4.切换到WiFi连接时,增加显示NetworkID;5.更新图片压缩的 ...
- NLP第八条
今日!我虽啥也没干,但我还是有着学习的心的~ 也许是“遵义会议”呢 那也说不定 留下这句话再说 哈哈哈哈哈哈 只能抄抄NLP第八条了 谁叫我选了个灰常有意义的通识课咧 八,每一 ...
- windows 安装zookeeper
1 .下载 java sdk 和zookeeper 安装包 因为zookeeper是依赖java sdk,运行zookeeper先要,安装javaSDK . 2.安装zookeeper,zookee ...
- 微信小程序页面跳转方法和携带参数详解
1.页面跳转方式 (1)标签跳转 open-type的属性值对应api里的用法即wx.的用法 1 <navigator url="/page/navigate/navi ...
- Java体系学习书籍推荐
以下所有资料均可在:Java知识分享网下载. 大家有推荐的书可以在下方留言! 开源代码GitHub仓库总结 计算机基础 计算机科学导论 --(如果不是计算机科班的,应先看看计算机基础,了解一些基本概 ...