背景:要把<script>等<>html标签替换掉;把敏感词屏蔽或者替换等;
1.刚开始可能这么写:                    
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.既处理发送到服务端,也处理从服务端返回到客户端:            

现在只是消息从一头发往另一头进行的过滤,而现实之中往往是消息从客户端发往服务器端,服务器端也有一个反馈,
现在想做这样一个过滤器,既可以过滤从客户端发往服务器端的消息,也可以过滤从服务器端返回来的消息;
怎么做呢?
正如struts2的interceptor和tomcat等容器的filter都是这样做的;既处理过去的消息,也处理回来的消息;
 
把request、response交给过滤器的话,过滤器既能把request对象处理,也能把response对象处理掉;
处理request的过滤器的顺序和处理response的过滤器的顺序正好是相反的:
这里简单使用Request中包含一个string、Response中包含一个string来简单模拟:

上代码:

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设计模式-责任链的更多相关文章

  1. 【设计模式】Java设计模式 - 责任链模式

    [设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...

  2. java 设计模式 -- 责任链模式

    设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪 ...

  3. 我的Java设计模式-责任链模式

    今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...

  4. Java设计模式-责任链模式

    提出问题: 最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为 ...

  5. Java设计模式の责任链模式

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

  6. java 设计模式-责任链

    责任链设计模式,其实就是处理同一个请求的对象连接成一条链,请求的路径经过这条链,符合要求的就处理这个请求,不符合就接着往下面抛出,直道有人处理这条请求. 业务:比如啊,公司个人请假,三天以下就是主管审 ...

  7. Java设计模式-责任链模式(Chain of Responsibility)

    接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求.但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任 ...

  8. Java设计模式—责任链模式

    责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 责任链模式的重点是在"链& ...

  9. iOS设计模式 - 责任链

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

随机推荐

  1. mysql设置更改root密码、mysql服务器的连接、mysql常用命令

     1.设置更改root密码 查看mysql 启动与否,若没启动就运行:/usr/local/mysql56/bin/mysqlps aux |grep mysql  或 netstat -tulnp ...

  2. RESTful规范(二)

    七 解析器 解析器的作用: -用来解析前台传过来的数据编码方式 urlencoded:form表单:name=lqz&age= formdata :上传文件:--dadfgdgag-- jso ...

  3. C++学习(十五)(C语言部分)之 数组二

    数组大纲 多维数组 二维数组 重点 (三位以上基本不会用到) 都是用来存数据 一个班有20个人 可以用一维数组存20个人的年龄 int age[20]; 一个年级10个班 每个班20人 int age ...

  4. 【HDOJ1045】【DFS】

    http://acm.hdu.edu.cn/status.php?user=MekakuCityActors&pid=1045&status=5 Fire Net Time Limit ...

  5. hdu2509 Be the Winner 博弈

    Let's consider m apples divided into n groups. Each group contains no more than 100 apples, arranged ...

  6. Go Example--缓存通道

    package main import "fmt" func main() { //缓存通道 msg := make(chan string,2) msg <- " ...

  7. 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 ...

  8. fcntl获取和修改文件打开状态标志

    [root@bogon code]# cat b.c #include<stdio.h> #include<error.h> #include<unistd.h> ...

  9. linux面试题(自己添加了一些注释说明)

    1.linux如何挂在windows下的共享目录 首先需要在Windows中创建一个文件夹用来共享,例如下面就是server是用来共享的,貌似在哪个位置创建都可以,我是在d盘创建的 1 mount.c ...

  10. MySQL Cursor Demo

    -- 使用cursor的demo -- ==============================## -- 删除存储过程 DROP PROCEDURE USP_TestCursor; DELIMI ...