【java设计模式】责任链模式
可以随时添加过滤器,并在主方法中添加删除:
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设计模式】责任链模式的更多相关文章
- 【设计模式】Java设计模式 - 责任链模式
[设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...
- java 设计模式 -- 责任链模式
设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪 ...
- 我的Java设计模式-责任链模式
今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...
- Java设计模式-责任链模式
提出问题: 最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为 ...
- Java设计模式の责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- Java设计模式-责任链模式(Chain of Responsibility)
接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求.但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任 ...
- Java设计模式—责任链模式
责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 责任链模式的重点是在"链& ...
- 浅谈Python设计模式 -- 责任链模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 之前在最开始就聊了Python设计模式有三种,其中关于创建型和结构型设计模式基本 ...
- Java与设计模式-责任链模式
责任链模式属于行为型设计模式之中的一个,怎么理解责任链?责任链是能够理解成数个对象首尾连接而成,每个节点就是一个对象.每个对象相应不同的处理逻辑,直至有一个对象响应处理请求结束.这一种模式成为责任链模 ...
- php 23种设计模式 - 责任链模式
责任链模式 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行 ...
随机推荐
- .net core 使用X509 私钥加密请求
1.获取证书路径 var basePath = _environment.ContentRootPath; //商户私钥证书,用于对请求报文进行签名 "); 2.数据加密 .net core ...
- tab面板,html+css
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- Audio Source组件及相关API
Audio Source:声音组件.需要与 Audio Listener 配合使用,Main Camera 会默认有 Audio Lisetener. Audio Clip:声音片段.指定需要播放的音 ...
- 12. ZooKeeper配额和认证
ZooKeeper具有与其数据模型相关的可配置配额(quota). 可以设置znode上的配额限制和存储的数据量.如果ZooKeeper命名空间中的一个子树超出与其关联的配额,ZooKeeper会在日 ...
- 升级PyCham到2017.3后import sys模块报错的问题
今天PyCharm提示升级后选择了更新,根据提示更新成功(2017.3)后发现总是报无法找到sys模块的错误,截图如下: 其实有一条红线留在那里也不影响运行和使用,但总看着不爽. 经过一番研究,由于我 ...
- HDU 1698 Just a Hook 线段树+lazy-target 区间刷新
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- TL-WR703Nv1.7刷写openwrt固件
TP-LINK TL-WR703N是一个小型的路由器,可以有线转WiFi,3G转WiFi,很多人拿它刷openwrt系统,然后可以在上面各种搞事. V1.7以前 通常刷openwrt的做法是, 下载一 ...
- windows添加默认路由
由于GW的原因,我们无法使用强大的google,身为技术屌丝,这是不能容忍的,于是乎使用了VPN,但是VPN连上之后,悲剧发生了,我的服务器连不上了,怎么整 原来一切都是很简单,在windows上添加 ...
- 翻煎饼 Stacks of Flapjacks
题意:本题意为煎饼排序,大的放在上面,小的放在下面(此题输入是从上到下输入的),为煎饼排序是通过一系列的"翻转"动作来完成的.翻转动作就是将一个小铲插到一叠煎饼中的某两个煎饼之间, ...
- [Android App]IFCTT,即:If Copy Then That,是一个基于IFTTT的"This"实现
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/8075738.html IFCTT,即:If Copy Then ...