java设计模式-责任链
public class Main { public static void main(String[] args) {
String msg = "大家好:),<script>,敏感,被就业,撒的合法了思考的环境法拉盛看到回复";
MsgProcessor mp = new MsgProcessor();
mp.setMsg(msg);
String result = mp.processor();
System.out.println(result); } }
public class MsgProcessor {
private String msg; public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
} public String processor(){
//process the html tag<>
String r = msg.replace('<', '[').replace('>', ']');
//process the sensitive words
r = r.replace("被就业", "就业")
.replace("敏感","");
return r;
} }
但是上面写的缺点:
如果还有其他的逻辑,其他的替换,那么又要在processor里面写其他的替换法则,不利于扩展;
2.于是换成下面写法:
定义接口Filter:
public interface Filter { String doFilter(String str); }
处理html tag的类:
public class HTMLFilter implements Filter {
@Override
public String doFilter(String str) {
//process the html tag<>
String r = str.replace('<', '[').replace('>', ']');
return r;
}
}
处理敏感词的类:
public class SensitiveFilter implements Filter { @Override
public String doFilter(String str) {
//process the sensitive words
String r = str.replace("被就业", "就业")
.replace("敏感","");
return r;
} }
MsgProcessor:
public class MsgProcessor {
private String msg;
private Filter[] filters = {new HTMLFilter(), new SensitiveFilter()}; public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
} public String processor(){
String r = msg; for(Filter f : filters){
r = f.doFilter(r);
} return r;
}
}
运行测试main,正确得到结果;
这样做的好处是:
新添加的规则可以放在filters数组的任意顺序上;
新添加的过滤规则可以任意扩展,只要实现Filter接口,并且实现方法,再添加进filters数组就可以了;
但是现在考虑一个问题:
如果已经存在一个过滤器链了,要想把这整个过滤器链加到原来的逻辑里面,怎么做呢?
3.修改为如下:
FilterChain.java:
public class FilterChain implements Filter{
List<Filter> filters = new ArrayList<Filter>(); public FilterChain addFilter(Filter f){
this.filters.add(f);
return this;
} public String doFilter(String str){
String r = str; for(Filter f: filters){
r = f.doFilter(r);
}
return r;
}
}
MsgProcessor:
public class MsgProcessor {
private String msg;
private FilterChain fc; public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public FilterChain getFc() {
return fc;
}
public void setFc(FilterChain fc) {
this.fc = fc;
} public String processor(){
return fc.doFilter(this.msg);
}
}
Main:
public class Main { public static void main(String[] args) {
String msg = "大家好:),<script>,敏感,被就业,撒的合法了思考的环境法拉盛看到回复";
MsgProcessor mp = new MsgProcessor();
FilterChain fc = new FilterChain();
//设置好过滤规则链
fc.addFilter(new HTMLFilter())
.addFilter(new FaceFilter()); FilterChain fc2 = new FilterChain();
fc2.addFilter(new SensitiveFilter()); fc.addFilter(fc2); mp.setMsg(msg);
mp.setFc(fc); String result = mp.processor();
System.out.println(result); } }
运行main,打印:
大家好^_^,[script],,就业,撒的合法了思考的环境法拉盛看到回复
4.既处理发送到服务端,也处理从服务端返回到客户端:

上代码:
Request:
package com.cy.dp.filter; public class Request {
String requestStr; public String getRequestStr() {
return requestStr;
} public void setRequestStr(String requestStr) {
this.requestStr = requestStr;
}
}
Response:
package com.cy.dp.filter; public class Response {
String responseStr; public String getResponseStr() {
return responseStr;
}
public void setResponseStr(String responseStr) {
this.responseStr = responseStr;
}
}
Filter:
package com.cy.dp.filter; public interface Filter { void doFilter(Request request, Response response, FilterChain chain); }
HTMLFilter:
package com.cy.dp.filter; public class HTMLFilter implements Filter { @Override
public void doFilter(Request request, Response response, FilterChain chain) {
//process the html tag<>
request.requestStr = request.requestStr.replace('<', '[').replace('>', ']') + "----HTMLFilter()";
chain.doFilter(request, response, chain); response.responseStr += "----HTMLFilter()";
} }
SensitiveFilter:
package com.cy.dp.filter; public class SensitiveFilter implements Filter { @Override
public void doFilter(Request request, Response response, FilterChain chain) { //process the sensitive words
request.requestStr = request.requestStr.replace("被就业", "就业").replace("敏感","") + "----SensitiveFilter()";
chain.doFilter(request, response, chain); response.responseStr += "----SensitiveFilter()";
} }
FaceFilter:
package com.cy.dp.filter; public class FaceFilter implements Filter { @Override
public void doFilter(Request request, Response response, FilterChain chain) {
//process the face
request.requestStr = request.requestStr.replace(":)", "^_^") + "----FaceFilter()";
chain.doFilter(request, response, chain); response.responseStr += "----FaceFilter()";
}
}
FilterChain:
package com.cy.dp.filter; import java.util.ArrayList;
import java.util.List; public class FilterChain implements Filter{
List<Filter> filters = new ArrayList<Filter>();
int index = 0; public FilterChain addFilter(Filter f){
this.filters.add(f);
return this;
} @Override
public void doFilter(Request request, Response response, FilterChain chain) {
if(index==filters.size()) return; Filter f = filters.get(index);
index ++;
f.doFilter(request, response, chain);
}
}
测试代码Main:
package com.cy.dp.filter; public class Main { public static void main(String[] args) {
String msg = "大家好:),<script>,敏感,被就业,撒的合法了思考的环境法拉盛看到回复";
Request request = new Request();
request.setRequestStr(msg);
Response response = new Response();
response.setResponseStr("response"); //设置好过滤规则链
FilterChain fc = new FilterChain();
fc.addFilter(new HTMLFilter())
.addFilter(new SensitiveFilter())
.addFilter(new FaceFilter()); fc.doFilter(request, response, fc); System.out.println(request.getRequestStr());
System.out.println(response.getResponseStr());
} }
运行结果:
大家好^_^,[script],,就业,撒的合法了思考的环境法拉盛看到回复----HTMLFilter()----SensitiveFilter()----FaceFilter()
response----FaceFilter()----SensitiveFilter()----HTMLFilter()
java设计模式-责任链的更多相关文章
- 【设计模式】Java设计模式 - 责任链模式
[设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...
- java 设计模式 -- 责任链模式
设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪 ...
- 我的Java设计模式-责任链模式
今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...
- Java设计模式-责任链模式
提出问题: 最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为 ...
- Java设计模式の责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- java 设计模式-责任链
责任链设计模式,其实就是处理同一个请求的对象连接成一条链,请求的路径经过这条链,符合要求的就处理这个请求,不符合就接着往下面抛出,直道有人处理这条请求. 业务:比如啊,公司个人请假,三天以下就是主管审 ...
- Java设计模式-责任链模式(Chain of Responsibility)
接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求.但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任 ...
- Java设计模式—责任链模式
责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 责任链模式的重点是在"链& ...
- iOS设计模式 - 责任链
iOS设计模式 - 责任链 原理图 说明 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链 ...
随机推荐
- mysql设置更改root密码、mysql服务器的连接、mysql常用命令
1.设置更改root密码 查看mysql 启动与否,若没启动就运行:/usr/local/mysql56/bin/mysqlps aux |grep mysql 或 netstat -tulnp ...
- RESTful规范(二)
七 解析器 解析器的作用: -用来解析前台传过来的数据编码方式 urlencoded:form表单:name=lqz&age= formdata :上传文件:--dadfgdgag-- jso ...
- C++学习(十五)(C语言部分)之 数组二
数组大纲 多维数组 二维数组 重点 (三位以上基本不会用到) 都是用来存数据 一个班有20个人 可以用一维数组存20个人的年龄 int age[20]; 一个年级10个班 每个班20人 int age ...
- 【HDOJ1045】【DFS】
http://acm.hdu.edu.cn/status.php?user=MekakuCityActors&pid=1045&status=5 Fire Net Time Limit ...
- hdu2509 Be the Winner 博弈
Let's consider m apples divided into n groups. Each group contains no more than 100 apples, arranged ...
- Go Example--缓存通道
package main import "fmt" func main() { //缓存通道 msg := make(chan string,2) msg <- " ...
- LeetCode - Kth Largest Element in a Stream
Design a class to find the kth largest element in a stream. Note that it is the kth largest element ...
- fcntl获取和修改文件打开状态标志
[root@bogon code]# cat b.c #include<stdio.h> #include<error.h> #include<unistd.h> ...
- linux面试题(自己添加了一些注释说明)
1.linux如何挂在windows下的共享目录 首先需要在Windows中创建一个文件夹用来共享,例如下面就是server是用来共享的,貌似在哪个位置创建都可以,我是在d盘创建的 1 mount.c ...
- MySQL Cursor Demo
-- 使用cursor的demo -- ==============================## -- 删除存储过程 DROP PROCEDURE USP_TestCursor; DELIMI ...