可以随时添加过滤器,并在主方法中添加删除:

Main

 package com.tn.filter;

 public class Main {
public static void main(String[] args) {
String msg="你好,:)哈哈,<HTML>,被加薪,敏感。被加薪,,呵呵。"; MsgProcessor mp=new MsgProcessor();
FilterChain filterChain=new FilterChain();
filterChain.addFilter(new HTMLFilter())
.addFilter(new SmileFaceFilter()); FilterChain filterChain2=new FilterChain();
filterChain2.addFilter(new SensitiveFilter()); filterChain.addFilter(filterChain2); mp.setMsg(msg);
mp.setFilterChain(filterChain); String result=mp.process();
System.out.println(result);
System.out.println(msg);
}
}

MsgProcessor

 package com.tn.filter;

 public class MsgProcessor {
/*
HTMLFilter htmlFilter;
SensitiveFilter sensitiveFilter;
*/
// Filter[] filters={new HTMLFilter(),new SensitiveFilter(),new SmileFaceFilter()};
FilterChain filterChain;
private String msg; public FilterChain getFilterChain() {
return filterChain;
} public void setFilterChain(FilterChain filterChain) {
this.filterChain = filterChain;
} public String getMsg() {
return msg;
} public void setMsg(String msg) {
this.msg = msg;
}
public String process(){
// String r=msg.replaceAll("<", "【")
// .replaceAll(">", "】")
// .replace("被加薪", "加薪");
/*
htmlFilter=new HTMLFilter();
sensitiveFilter=new SensitiveFilter();
String r=htmlFilter.dofilter(msg);
r=sensitiveFilter.dofilter(r);
*/ /*
for(Filter f:filters){
msg=f.dofilter(msg);
}
return msg;
*/
return filterChain.dofilter(msg);
}
}

FilterChain

 package com.tn.filter;

 import java.util.ArrayList;
import java.util.List; public class FilterChain implements Filter{
private List<Filter> filters=new ArrayList<Filter>(); public FilterChain addFilter(Filter f){
filters.add(f);
return this;
} public String dofilter(String str){
String result=str;
for(Filter f:filters){
result=f.dofilter(result);
}
return result;
}
}

Filter

 package com.tn.filter;

 public interface Filter {
public String dofilter(String str);
}

HTMLFilter

 package com.tn.filter;

 public class HTMLFilter implements Filter {

     @Override
public String dofilter(String str) {
return str.replaceAll("<", "[")
.replaceAll(">", "]");
}
}

SensitiveFilter

 package com.tn.filter;

 public class SensitiveFilter implements Filter {

     @Override
public String dofilter(String str) {
return str.replaceAll("被加薪", "加薪")
.replaceAll("敏感", "和谐");
} }

SmileFaceFilter

 package com.tn.filter;

 public class SmileFaceFilter implements Filter {

     @Override
public String dofilter(String str) {
return str.replaceAll(":\\)", "笑脸");
} }

顺序处理request,逆序处理response:

Main

 package com.tn.filter2;

 public class Main {
public static void main(String[] args) {
String msg="你好,:)哈哈,<HTML>,被加薪,敏感。被加薪,,呵呵。";
FilterChain fc=new FilterChain();
fc.addFilter(new HTMLFilter())
.addFilter(new SensitiveFilter());
Request request=new Request();
request.setStr(msg);
Response response=new Response(); System.out.println(request.getStr());
System.out.println(response.getStr()); fc.doFilter(request, response,fc); System.out.println(request.getStr());
System.out.println(response.getStr());
}
}

FilterChain

 package com.tn.filter2;

 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){
filters.add(f);
return this;
}
@Override
public void doFilter(Request request, Response response,FilterChain fc) {
if(index==filters.size()) return;
Filter f=filters.get(index++);
// filters.get(index).doFilter(request, response, fc);//这种写法会死循环,此语句的doFilter会调用FilterChain里的doFilter(),而不是调用具体Filter里的doFilter(),切记!
f.doFilter(request, response, fc);
// for(Filter f:filters){
// f.doFilter(request, response,fc);
// }
} }

Filter

 package com.tn.filter2;

 public interface Filter {
void doFilter(Request request,Response response,FilterChain fc);
}

HTMLFilter

 package com.tn.filter2;

 public class HTMLFilter implements Filter {

     @Override
public void doFilter(Request request, Response response,FilterChain fc) {
request.setStr(request.getStr().replaceAll("<", "【")+" -HTMLFilter()- ");
fc.doFilter(request, response, fc);
response.setStr(response.getStr()+" -HTMLFilter()- ");
} }

SensitiveFilter

 package com.tn.filter2;

 public class SensitiveFilter implements Filter{
@Override
public void doFilter(Request request, Response response,FilterChain fc) {
request.setStr(request.getStr().replaceAll("被加薪", "加薪")+" -SensitiveFilter()- ");
fc.doFilter(request, response, fc);
response.setStr(response.getStr()+" -SensitiveFilter()- ");
}
}

Request

 package com.tn.filter2;

 public class Request {
String str; public String getStr() {
return str;
} public void setStr(String str) {
this.str = str;
} }

Response

 package com.tn.filter2;

 public class Response {
String str="response"; public String getStr() {
return str;
} public void setStr(String str) {
this.str = str;
} }

【java设计模式】责任链模式的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 浅谈Python设计模式 -- 责任链模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 之前在最开始就聊了Python设计模式有三种,其中关于创建型和结构型设计模式基本 ...

  9. Java与设计模式-责任链模式

    责任链模式属于行为型设计模式之中的一个,怎么理解责任链?责任链是能够理解成数个对象首尾连接而成,每个节点就是一个对象.每个对象相应不同的处理逻辑,直至有一个对象响应处理请求结束.这一种模式成为责任链模 ...

  10. php 23种设计模式 - 责任链模式

    责任链模式 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行 ...

随机推荐

  1. tomcat集群日志切割和远程备份脚本分享

    笔者一共有3台tomcat服务器,一共4个tomcat服务,未来还会增加4个作为负载,笔者想通过在存储服务器对tomcat服务的日志进行远程切割和备份到存储上. 文中采用清空日志的方式,优点是不用重启 ...

  2. IT连创业系列:App产品上线后,运营怎么搞?(中)

    等运营篇写完,计划是想写一个IOS系列,把IT连App里用到和遇到的坑都完整的和大伙分享. 不过写IOS系列前,还是要认真把这个运营篇写完,接下来好好码字!!! 上篇说到,我们计划去一次富士康门口,拉 ...

  3. h5前端流行的框架

    很多时候别人问你,上手的框架有哪些,其实我们都是知道的,只是一时却也说不上哪些比较,这里想给大家介绍一下,我所遇到的,还算好用的框架,做个分享 1 Bootstrap 官网:http://getboo ...

  4. 求知的木头 Cannot load browser "PhantomJS": it is not registered! Perhaps you are missing some plugin? 测试安装遇到的BUG

    原文链接 求知的木头   Cannot load browser "PhantomJS": it is not registered! Perhaps you are missin ...

  5. 用python批量修改文件名

    从youtube上当下来百来首mv,每个都需要去掉视频,这还挺好弄得,格式工厂一弄就完了,但是文件名,都带有乱七八糟的*啥的巴拉巴拉的,咋修改啊,几百首总不可能一个一个rename吧 #批量修改文件名 ...

  6. maridb\mysql 源码安装,以10.1.26版本为例

    mysql 源码安装(mariadb 10.1.26) 1.环境部署 1 安装cmake 源码安装三部曲或者yum install cmake2安装依赖包yum install -y ncurses- ...

  7. HDU-1242-Rescu

    Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  8. Java 代码质量

    被滥用的instanceof instanceof滥用, 或者直接强转, 大都数情况可以用方法override, 而且应当避免使用isA(), isB()之类的写法; 比如sonA和sonB都继承自p ...

  9. 【Hdu3652】B-number(数位DP)

    Description 题目大意:求小于n是13的倍数且含有'13'的数的个数. (1 <= n <= 1000000000) Solution 数位DP,题目需要包含13,且被13整除, ...

  10. 【Hdu3555】 Bomb(数位DP)

    Description 题意就是找0到N有多少个数中含有49. \(1\leq N \leq2^{63}-1\) Solution 数位DP,与hdu3652类似 \(F[i][state]\)表示位 ...