背景:要把<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用户管理、常用sql语句、MySQL数据库备份恢复

    1.MySQL用户管理 给远程登陆用户授权:grant all on *.* to 'user1'@'127.0.0.1' identified by '123456' (这里的127.0.0.1是指 ...

  2. 玩vue+mockjs

    玩vue+mockjs vue中用mock制造模拟接口(本文主要解决坑),一定要看完哦 最近新入职一家公司,后端造接口速度很慢,想来想去还是搞一套模拟接口,来满足开发需求,有人会问,我造一个死数据不就 ...

  3. 一个简易的drf的项目例子

    luffy_city 1.项目介绍 今日内容:(路飞项目) contentType组件: 路飞学成项目,有课程,学位课(不同的课程字段不一样),价格策略 问题, 如何设计表结构,来表示这种规则 为专题 ...

  4. 【Jmeter】插件

    一.插件管理 前提:很多时候,尤其是性能测试的时候,我们需要用到很多场景,需要得到一些参数值等等. 二.插件地址 URL : https://jmeter-plugins.org/downloads/ ...

  5. Python知识点整理,基础3 - 字典操作

  6. js动态加载数据并合并单元格

    js动态加载数据合并单元格, 代码如下所示,可复制直接运行: <!DOCTYPE HTML> <html lang="en-US"> <head> ...

  7. 【shell编程】之基础知识-基本运算符

    Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 ...

  8. nginx启动重启与升级以及检测配置文件

    查看nginx的主进程号 ps -ef|grep nginx 从容停止nginx kill - QUIT nginx主进程号 或者 kill - QUIT nginx的pid文件所在,例如我的 [ro ...

  9. TECH books

    文章目录 TECH books linux vxworks bat c gdb c++ vbscript make java bash perl web uml software-misc cpu e ...

  10. MySQL Disk--SSD和HDD的性能

    ========================================================= 机械硬盘的性能 7200转/分的STAT硬盘平均物理寻道时间是9ms 10000转/ ...