【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)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行 ...
随机推荐
- [O]ORACLE物化视图的使用
用于数据复制的物化视图 物化视图的一个主要功能就是用于数据的复制,Oracle推出的高级复制功能分为两个部分,多主复制和物化视图复制.而物化视图复制就是利用了物化视图的功能. 物化视图复制包含只读物化 ...
- TensorFlow简易学习[3]:实现神经网络
TensorFlow本身是分布式机器学习框架,所以是基于深度学习的,前一篇TensorFlow简易学习[2]:实现线性回归对只一般算法的举例只是为说明TensorFlow的广泛性.本文将通过示例Ten ...
- 《java.util.concurrent 包源码阅读》07 LinkedBlockingQueue
这篇文章来说说稍微复杂一些的LinkedBlockingQueue.LinkedBlockingQueue使用一个链表来实现,会有一个head和tail分别指向队列的开始和队列的结尾.因此Linked ...
- 解决WebSocket兼容ie浏览器版本问题
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7942323.html 在使用Netty进行WebSocket开发时,测试发现:ie 11系列个别低版本连接W ...
- memcached一致性哈希及php客户端实现
1.memcached分布式算法 memcached的分布式是依靠客户端的算法来实现,假设键名为$key,服务器数量为N,常规的实现方式有两种: 取模哈希 crc32($key)%N,通过这个算法将键 ...
- android studio 目录结构讲解
android studio 目录结构讲解 src 毫无疑问,src目录是放置我们所有 Java代码的地方,它在这里的含义和普通 Java 项目下的 src目录是完全一样的,展开之后你将看到我们刚才创 ...
- 【机器学习】彻底搞懂CNN
之前通过各种博客视频学习CNN,总是对参数啊原理啊什么的懵懵懂懂..这次上课终于弄明白了,O(∩_∩)O~ 上世纪科学家们发现了几个视觉神经特点,视神经具有局部感受眼,一整张图的识别由多个局部识别点构 ...
- 关于xampp集成开发环境的建立与初步认识
针对于xampp集成开发环境的建立主要分大步骤: 1.把xampp的压缩包压缩到一个盘中,比如c盘:然后点击中间的那个图标开始安装,由于这个软件是配置基本已经OK了,故可以直接next ...
- iOS APP上架被拒重新提交审核教程
iOS APP审核比较严格,难免会出现被拒绝的情况,需要根据苹果反馈的问题修改后重新打包上传审核! 1.登录itunesconnect.https://itunesconnect.apple.com进 ...
- 用python批量修改文件名
从youtube上当下来百来首mv,每个都需要去掉视频,这还挺好弄得,格式工厂一弄就完了,但是文件名,都带有乱七八糟的*啥的巴拉巴拉的,咋修改啊,几百首总不可能一个一个rename吧 #批量修改文件名 ...