java设计模式-责任链
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.既处理发送到服务端,也处理从服务端返回到客户端:
上代码:
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设计模式-责任链的更多相关文章
- 【设计模式】Java设计模式 - 责任链模式
[设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...
- java 设计模式 -- 责任链模式
设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪 ...
- 我的Java设计模式-责任链模式
今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...
- Java设计模式-责任链模式
提出问题: 最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为 ...
- Java设计模式の责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- java 设计模式-责任链
责任链设计模式,其实就是处理同一个请求的对象连接成一条链,请求的路径经过这条链,符合要求的就处理这个请求,不符合就接着往下面抛出,直道有人处理这条请求. 业务:比如啊,公司个人请假,三天以下就是主管审 ...
- Java设计模式-责任链模式(Chain of Responsibility)
接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求.但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任 ...
- Java设计模式—责任链模式
责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 责任链模式的重点是在"链& ...
- iOS设计模式 - 责任链
iOS设计模式 - 责任链 原理图 说明 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链 ...
随机推荐
- day022 python (re模块和 模块)
re模块是python提供的一套关于正则表达式的模块.核心功能有四个: 1.findall (查找所有,返回list) lst=re.findall("m",'salalwmaop ...
- Socket远程桌面
自建Socket转发,使用远程桌面(mstsc)连接家中电脑 网络结构图如下: 开题先放图,一切全靠编哈哈. 进入正题! 如图所示,我们需要一个公网服务器,利用公网服务器将内网的数据进行转发,从而 ...
- 20165313 《Java程序设计》第五周学习总结
教材学习总结 下面是我认为的重点,不足之处还请谅解: 1内部类:在一个类中定义另一个类:外嵌类:包含内部类的类. 2内部类的类体中不能声明类变量和类方法:外嵌类的类体中可以用内部类声明对象. 3非内部 ...
- synchronized (string.intern())
在jdk7下慎用String.intern()作为synchronized的对象锁: https://www.cnblogs.com/yhlx/p/3498387.html String.intern ...
- 怎样优化app,看Facebook怎样做
周四,Facebook Engineering blog 发表了一篇名为<Improving Facebook on Android>博文.博文从四个方面(Performance,Data ...
- css重难点笔记
只有定位(static除外)的盒子才有z-index,即对静态定位,文档流和浮动设置z-index,都是无效的. 一个盒子如果未给宽度,那么被浮动,绝对定位,display:inline-block之 ...
- 随机重拍与抽样(random_shuffle,random_sample,random_sample_n)
//版本一:使用内部的随机数生成器 template<class RandomAccessIterator> void random_shuffle( RandomAccessIterat ...
- ipset可使iptables一次性封多个ip
ipset是什么? ipset是iptables的扩展,它允许你创建 匹配整个地址集合的规则.而不像普通的iptables链只能单IP匹配, ip集合存储在带索引的数据结构中,这种结构即时集合比较大也 ...
- VMware虚拟机里centos7下安装mysql5.6并授权远程连接Navicat
这节来安装Mysql5.6,并远程授权连接本地windows的Navicat,可以根据以下步骤安装.此文章为自己收藏,必要时拿出来直接用的,有需要的友友可以查看查看的.文章图片有借助于网络的. 1.新 ...
- 关于plot画图的原理
首先是导入的: Import matplotlib.pyplot as plt 这份导入要背住,没事就是需要你进行导入的: 然后就是画图了,下面举一个例子: import numpy as np im ...