设计模式(一)Chain Of Responsibility责任链模式

设计模式篇章,源于网课的学习,以及个人的整理

 

在我们接收用户提交的字符时,常常会使用到过滤,在学习责任链模式前,我们是这样做的

1.定义一个类

public class MsgProcesser {String msg;public MsgProcesser(String msg) {this.msg=msg;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public String process() {String r=msg.replace("<", "[").replaceAll(">", "]");r=r.replaceAll("被就业", "就业");r=r.replaceAll("敏感", "");return r;}
}

测试

public static void main(String[] args) {String message="大家好:),<script>,敏感,被就业,网络授课没感觉,因为看不见大家伙儿";MsgProcesser mp=new MsgProcesser(message);System.out.println(mp.process());}

往往添加数据会很不方便,于是,借用责任链的方式,我们可以这样写

 1.定义一个接口,内部有抽象方法doFilter

package com.littlepage.testChainOfResponsibility;public interface Filter {String doFilter(String str);
}

2.定义一些不同的过滤器类实现过滤器接口,类似HTMLFilter,SensitiveFilter

package com.littlepage.testChainOfResponsibility;public class HTMLFilter implements Filter{@Overridepublic String doFilter(String str) {return str.replaceAll("<", "[").replaceAll(">", "]");    }}
package com.littlepage.testChainOfResponsibility;public class SensitiveFilter implements Filter{@Overridepublic String doFilter(String str) {return str.replaceAll("敏感", "*");}}

3.进行主要链条的编写,就是新建一个类叫MsgProcesser,该类将这些方法进行串起来,使用foreach循环进行迭代进行过滤,在后续情况下,也就是说,你需要再添加过滤的关键字,就可以直接新建一个链条上的小块(也就是一个类),进行添加,而不用再去写其他东西

package com.littlepage.testChainOfResponsibility;public class MsgProcesser {Filter[] filter= {new HTMLFilter(),new SensitiveFilter()};String msg;public MsgProcesser(String msg) {this.msg=msg;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public String process() {String r=msg;for(Filter f:filter) {r=f.doFilter(r);}return r;}
}

图示:

或者说,你依然可以定义一个责任链类(FilterChain)用来代替MsgProcesser类,里面用ArrayList容器盛放filter

该代码为:

package com.littlepage.testChainOfResponsibility;import java.util.ArrayList;
import java.util.List;public class FilterChain {List<Filter> filters=new ArrayList<>();public FilterChain addFilter(Filter f) {filters.add(f);return this;}public String doFilter(String str) {String r=str;for (Filter filter : filters) {r=filter.doFilter(r);}return r;}
}

主方法的调用改为

package com.littlepage.testChainOfResponsibility;public class Main {public static void main(String[] args) {String message="大家好:),<script>,敏感,被就业,网络授课没感觉,因为看不见大家伙儿";FilterChain fc=new FilterChain();fc.addFilter(new HTMLFilter()).addFilter(new SensitiveFilter());System.out.println(fc.doFilter(message));}
}

若该FilterChain也实现Filter接口,那么就可以自己添加自己的FilterChain了,很巧妙

由此可以拓展出,tomcat下可以加上request和response过滤器

代码如下:

 

package top.littlepage.designPattern.responsibilityChain;public interface Filter {void doFilter(Request req,Response res,FilterChain fc);
}
package top.littlepage.designPattern.responsibilityChain;import java.util.ArrayList;
import java.util.List;public class FilterChain implements Filter {List<Filter> filters = new ArrayList<>();int index = -1;public FilterChain addFilter(Filter f) {filters.add(f);return this;}public void doFilter(Request req, Response res, FilterChain fc) {if (index == filters.size()-1)return;index++;filters.get(index).doFilter(req, res, fc);}}
package top.littlepage.designPattern.responsibilityChain;public class HTTPFilter implements Filter{@Overridepublic void doFilter(Request req, Response res,FilterChain fc) {req.setRequestStr(req.getRequestStr().replaceAll("<", "[").replaceAll(">", "]"));System.out.println("after reqHttp:"+req);fc.doFilter(req, res, fc);res.setResponseStr(res.getResponseStr().replaceAll("//", "pp"));System.out.println("after resHttp:"+res);}}
package top.littlepage.designPattern.responsibilityChain;public class Request {private String requestStr;public Request() {requestStr="";}public Request(String requestStr) {this.requestStr = requestStr;}public String getRequestStr() {return requestStr;}public void setRequestStr(String requestStr) {this.requestStr = requestStr;}@Overridepublic String toString() {return "Request [requestStr=" + requestStr + "]";}
}
package top.littlepage.designPattern.responsibilityChain;public class Response {private String responseStr;public Response() {responseStr="";}public Response(String responseStr) {this.responseStr = responseStr;}public String getResponseStr() {return responseStr;}public void setResponseStr(String responseStr) {this.responseStr = responseStr;}@Overridepublic String toString() {return "Response [responseStr=" + responseStr + "]";}}
package top.littlepage.designPattern.responsibilityChain;public class SensitiveFilter implements Filter{@Overridepublic void doFilter(Request req, Response res,FilterChain fc) {req.setRequestStr(req.getRequestStr().replaceAll("sensitive", "***"));System.out.println("after reqSen:"+req);fc.doFilter(req, res, fc);res.setResponseStr(res.getResponseStr().replaceAll("mingan", "notmingan"));System.out.println("after resSen:"+res);}
}
package top.littlepage.designPattern.responsibilityChain;public class Test {public static void main(String[] args) {String str="<script>//abbbmingansensitive";Request req=new Request(str);Response res=new Response(str);FilterChain fc=new FilterChain();fc.addFilter(new HTTPFilter());fc.addFilter(new SensitiveFilter());fc.doFilter(req, res, fc);}
}

控制台打印如下

 

可以看出,首先接收端进行接收request分别执行Http进行过滤req,执行Sensitive进行过滤req

到达服务端,开始原路返回,先执行Sensitive过滤器进行过滤,然后执行Http过滤器进行过滤,

这一系列变成了一个链条,将各个过滤器穿在一起,也就成了所说的责任链设计模式。

由于是一步一步进行拦截,所以说,也可以称作拦截器模式

由此可见:原理和tomcat的filter的大致原理一样,先原线路进行依次对请求值进行过滤,然后

再对客户端的返回值进行过滤

 

转载于:https://www.cnblogs.com/littlepage/p/9914497.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如果你是IT技术人员,请思考这15个问题

行内的人自嘲是程序猿、屌丝和码农&#xff0c;行外的人也经常拿IT人调侃&#xff0c;那么究竟是IT人没有价值&#xff0c;还是没有仔细思考过自身的价值&#xff1f; 1.搞IT的是屌丝、码农、程序猿&#xff1f; 人们提到IT人的时候&#xff0c;总会想到他们呆板、不解风情&…

在Windows上运行-XX:CompileCommand

HotSpot JVM提供了几个与即时 &#xff08; JIT &#xff09;编译有关的命令行参数。 在本文中&#xff0c;我介绍了开始应用命令行标志-XX&#xff1a;CompileCommand所需的步骤&#xff0c;以查看对单个方法执行的即时编译。 JIT概述 Nikita Salnikov-Tarnovski的博客文章您…

匹配中文字符的正则表达式: [u4e00-u9fa5](

匹配双字节字符(包括汉字在内)&#xff1a;[^x00-xff]评注&#xff1a;可以用来计算字符串的长度&#xff08;一个双字节字符长度计2&#xff0c;ASCII字符计1&#xff09;匹配空白行的正则表达式&#xff1a;ns*r评注&#xff1a;可以用来删除空白行匹配HTML标记的正则表达式&…

python define function的顺序_Python怎么根据一个函数来决定列表顺序

def__init__(self,function):self._queue[]self.functionfunction然后要写一往列表里增加元素的方法&#xff0c;按照function排序&#xff0c;function类型为函数defadd(self,item):"""AddtothisP...def __init__(self,function):self._queue []self.function…

excel单元格内容合并

这几天在整理数据&#xff0c;有时候数据都在表格的不同单元格中&#xff0c;想把两格内容合并为一格&#xff0c;于是验证了两种方法方法一:(1)在B1输入公式A1&B1(2)做完第一步后,选中B1后,鼠标移到单元格右下出现“”符号是下拉,就能得到结果,如图:方法二(1)在B1输入公式…

主分区与逻辑分区的区别

硬盘分区有三种&#xff0c;主磁盘分区、扩展磁盘分区、逻辑分区。 一个硬盘可以有一个主分区&#xff0c;一个扩展分区&#xff0c;也可以有一个主分区和若干逻辑分区。&#xff08;图1为大家最常见硬盘分区类型&#xff09; 主分区 主分区是硬盘的启动分区&#xff0c…

wxpython图形编程_wxpython  图像编程

1)目前遇到一个问题&#xff0c;就是wxpython显示一个图片&#xff0c;然后可以在图片上画矩形&#xff0c;点&#xff0c;line&#xff0c;circle and soon&#xff0c;最后保存矩形的坐标.但是现在可以在屏幕上画矩形&#xff0c;无法在图片上做标记&#xff0c;我反思的原因…

如何利用火狐获取网址中的提交链接

1、添加firebugz组件 2、用火狐打开你要的获取链接的网址例如 http://www.dce.com.cn/dalianshangpin/xqsj/tjsj26/jdtj/jdcjpm/index.html 3、按F12 4、点击你查询的按钮如点击如图下中的年月然后在firebug上点击网络获取里面的post链接 5、点击HTML 中的一个post &#xf…

python-22 eval json pickle shelve 之间差别

1.eval:可以转化字符串&#xff0c;字典&#xff0c;元组&#xff0c;列表等一般类型&#xff0c;不能转化类&#xff0c;函数 2.json:可以转化一般类型外&#xff0c;还可转化函数&#xff0c;可以在任何语言间转化&#xff0c;转化为字符串&#xff0c;可以写入文本&#xff…

打破冷漠僵局文章_研究僵局–第1部分

打破冷漠僵局文章我敢肯定我们都去过那里&#xff1a;太晚了&#xff0c;您饿了&#xff0c;您的服务器已挂起&#xff0c;或者您的应用程序正在以蜗牛的速度运行&#xff0c;并且有人喘着粗气想要您解决问题&#xff0c;然后再去解决。 您的应用程序意外挂起的可能原因之一是称…

vs2008下设置.h, .lib和 .dll 的路径配置全图及其意义

文件夹: 类型文件 include: .h &#xff08;头文件&#xff09; lib: .lib &#xff08;库&#xff09; 前面二者在vs2008中通过属性来配置。 bin: .dll &#xff08;动态链接库&#xff09; 动态链接库是通过系统路径来配置的。 添加库&#xff08;libs&#xff09;文件目录 …

按键精灵调用迅雷下载文件

Set ThunderAgent CreateObject("ThunderAgent.Agent") 建立迅雷接口对象ThunderAgent.AddTask "http://10.10.10.10/电影世界/12新电影/随风而逝.rmvb", "随风而逝.rmvb", "", "", "", - 1 , 0, - 1 Ca…

POJ1821 Fence

传送门 这道题是一道很好的单调队列优化DP的例子。 题目大意是有n个工人&#xff0c;每个人可以粉刷一段长度不超过l[i]的墙&#xff0c;如果一个人粉刷了那么他必须要粉刷第s[i]块墙&#xff0c;一个人粉刷一块墙能得到p[i]的钱&#xff0c;求所有工人得到的钱的最大值。 我们…

使用Spring Security和jdbc的Spring Boot

Spring安全性是一个很棒的框架&#xff0c;可节省开发人员的大量时间和精力。 此外&#xff0c;它还具有足够的灵活性&#xff0c;可以自定义并满足您的需求。 使用JDBC和Spring Security非常容易&#xff0c;并且许多操作是自动化的。 这将是一个最小的展示。 gradle文件包含…

map 循环_被问到Spring循环依赖怎么解决?秀给面试官看!内附图解

不知道最近有没有被一道Java面试题刷爆朋友圈&#xff0c;Spring框架的循环依赖如何解决。我收到了不少粉丝的提问&#xff0c;在了解到之后&#xff0c;也去网上查询了一些资料&#xff0c;自己也询问了身边的同事&#xff0c;总结出以下几个方面&#xff0c;今天就和我来看一…

调用ThunderAgent 迅雷局域网版的开发

P2P方式的下载&#xff0c;为我们获取互联网资料提供了一个强有力的工具&#xff0c;它可以争取最大的带宽&#xff0c;获取最大的下载速度。最早采用P2P方式下载的工具有BT、电骡等&#xff0c;后来许多传统“多线程断点续传类”软件&#xff0c;也增加了对的支持&#xff0c;…

详解虚拟机中为Linux添加硬盘

Linux添加硬盘是在原来安装的硬盘空间不够或者需要使用其他硬盘上的东西时候的解决办法&#xff0c;因为大多数初学者习惯使用虚拟机&#xff0c;这里以在Vmware虚拟机中实现Linux添加硬盘的具体步骤来详细介绍说这个问题。 Vmware中为linux增加硬盘 1. 在vmware的setting中为虚…

vue 常用功能和命令

1. vue-cli 构建项目 # 全局安装 vue-cli $ npm install --global vue-clif # 创建一个基于 webpack 模板的新项目 $ vue init webpack your-project-name # 安装依赖 $ npm install # 进入项目 $ cd your-project-name # 开发版本打包并运行 $ npm run dev# 线上环境整个项目打…

项目管理最佳实践方法_项目管理:控制项目进度最佳实践

5分钟站立会议5 MinutesStand-up Meeting&#xff08;5分钟站立会议&#xff09;是实践中项目进度管理的好办法。5分钟站立会议时&#xff0c;项目团队成员在固定时间&#xff08;如每天上午8:30&#xff5e;8:35&#xff09;、固定地点&#xff0c;每天站着围在一起&#xff0…

《海龟交易法则》经典梳理

序言&#xff0c;第一&#xff5e;第三章 海归交易法则序言本书是历史上最好的5本交易学著作之一的理由&#xff1a;1&#xff0c;重要的不是交易系统而是交易者贯彻交易系统的能力。2&#xff0c;用浅显易懂的语言阐述行为金融学的某些原理如何用于交易和影响交易。3&#xff…