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

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

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

设计模式(一)Chain Of Responsibility责任链模式相关推荐

  1. 设计模式之略见一斑(Chain of Responsibility责任链模式)

    设计模式 写道 面向对象开发人员通常希望明确和减少对象间的责任,从而降低对象之间的耦合程序.这样我们的系统更加容易修改,同时也可降低产生缺陷的风险.从某种程度上说,java语言本身能够帮助降低对象间的 ...

  2. Chain of Responsibility -- 责任链模式

    在软件构建构成中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接收者,如果显示指定,将必不可少地带来请求发送者与接收者的紧密耦合.COR(Chain of Reposibility)设计 ...

  3. Chain of Responsibility 责任链模式 MD

    责任链模式 简介 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链,请求在这个链上[传递],直到链上的某一个对象决定处理此请求.发出这个请求的客户 ...

  4. Chain of Responsibility(责任链模式) 行为型

    责任链模式 一.概述 二.结构 三.适用场景 四.优缺点 五.实例 一.概述 描述:如组长不能处理的金额,需要向经理请求,经理不能请求的需要向老板请求,这样就现成了一条链,每个级别都能处理这金额.而不 ...

  5. 22.Chain of Responsibility(职责链)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.Chain of Responsibility(职责链)模式动机 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个 ...

  6. Java设计模式之行为型:责任链模式

    背景: 学校规定参加校招的同学必须要请假,且要有相关人员的签字,三天以下需辅导员签字.三到七天需要系主任签字,一个星期以上需要院长签字,更多的则需要校长签字! 上图将学生.辅导员.系主任.院长.校长组 ...

  7. 步步为营 .NET 设计模式学习笔记 十九、Chain of Responsibility(职责链模式)

    概述 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合. 如何使请求的发送者不需要指定具体的接受者?让请求的 ...

  8. 设计模式的C语言应用-责任链模式-第三章

    模式介绍 责任链将需要触发的对象组成一条链,发送者将请求发给链的第一个接收者,并且沿着这条链传递,直到有一个对象来处理它或者直到最后也没有对象处理而留在链末尾端. 图表 1责任链模式流程图 责任链在C ...

  9. 设计模式笔记十四:责任链模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 责任链模式 顾名思义,责任链模式(Chain of Responsibi ...

最新文章

  1. 【Python】ubuntu14安装pycaffe环境:python2.7及依赖库
  2. 测试sql语句执行时间
  3. DNS枚举工具DNSenum
  4. 三维重建1-位姿追踪:单应矩阵、本质矩阵和基本矩阵
  5. RabbitMQ(2) 一般介绍
  6. 实习技术员的基本功(十一)
  7. 电商美工需要的素材PSD分层模板
  8. linux 启动ftp服务,sftp服务
  9. 波卡生态DAO基础设施完成150万美元战略融资
  10. python判断安全密码_python 字符串实例:检查并判断密码字符串的安全强度
  11. Bucket不为空,请检查该Bucket是否包含未删除的Object或者未成功的Multipart碎片
  12. SSH框架 openSessionInView的配置
  13. 编译原理实验五:编译器自动生成工具
  14. 2022年最新微博批量删除代码_自动化删除新浪微博代码
  15. Tuxera2022Mac系统读写NTFS磁盘工具装机必备
  16. 禁用hiberfil.sys文件
  17. 删除 Microsoft Office Word 中页眉、页脚的横线
  18. 【前端应该掌握的一些知识点】
  19. 新零售如何做到线上线下相结合?
  20. 神经对抗网络 自动标注,神经对抗网络研究课题

热门文章

  1. Linux系统下如何安装JDK?
  2. 原生态基于OpenCV图像处理软件开发
  3. mysql多实例主从_window 下 mysql 单机多实例以及主从同步
  4. C语言源代码展示:常用转换函数实现原理
  5. C语言标识符、关键字和注释
  6. linux内核之旅ppt_微软Windows 10防病毒现已可用Linux上
  7. 网络光端机产品特点及实际应用范围详解
  8. [渝粤教育] 盐城师范学院 光学 参考 资料
  9. 【渝粤教育】电大中专工程图学基础 (3)作业 题库
  10. [渝粤教育] 西南科技大学 数据库应用 在线考试复习资料(1)