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

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

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{

    @Override
public String doFilter(String str) {
return str.replaceAll("<", "[").replaceAll(">", "]");
} }
package com.littlepage.testChainOfResponsibility;

public class SensitiveFilter implements Filter{

    @Override
public 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 = -; public FilterChain addFilter(Filter f) {
filters.add(f);
return this;
} public void doFilter(Request req, Response res, FilterChain fc) {
if (index == filters.size()-)
return;
index++;
filters.get(index).doFilter(req, res, fc); } }
package top.littlepage.designPattern.responsibilityChain;

public class HTTPFilter implements Filter{

    @Override
public 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;
} @Override
public 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;
} @Override
public String toString() {
return "Response [responseStr=" + responseStr + "]";
} }
package top.littlepage.designPattern.responsibilityChain;

public class SensitiveFilter implements Filter{

    @Override
public 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的大致原理一样,先原线路进行依次对请求值进行过滤,然后

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

设计模式(一)Chain Of Responsibility责任链模式的更多相关文章

  1. 设计模式(13)--Chain of Responsibility(责任链模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一 ...

  2. python 设计模式之 (Chain of Responsibility)责任链模式

    #写在前面 对于每一种设计模式,如果不理解它的原理和结构,是写不出例子来的.所以弄明白很重要. 等过完这段浑浑噩噩的日子,我要找个遍地开花的地方开怀大笑一场 #责任链模式定义 简书上一网友就把这个定义 ...

  3. Chain of Responsibility 责任链模式

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

  4. Chain of Responsibility 责任链模式 MD

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

  5. 设计模式C++学习笔记之十七(Chain of Responsibility责任链模式)

      17.1.解释 概念:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. main(),客户 IWom ...

  6. Chain of Responsibility - 责任链模式

    定义 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合度. 案例 比方如今有一个图形界面,它包含一个应用Application类,一个主窗体Window,一个buttonButton ...

  7. go语言设计模式之Chain Of Responsibility(责任链)

    ChainOfResponsibility.go package ChainOfResponsibility import ( "fmt" "io" " ...

  8. 设计模式19:Chain Of Responsibility 职责链模式(行为型模式)

    Chain Of Responsibility 职责链模式(行为型模式) 请求的发送者与接受者 某些对象请求的接受者可能有多种多样,变化无常…… 动机(Motivation) 在软件构建过程中,一个请 ...

  9. 【设计模式】行为型05责任链模式(Chain of responsibility Pattern)

    学习地址:http://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html demo采用了DEBUG级别举例子,理解起 ...

随机推荐

  1. Django框架----权限管理(设计分析以及具体细节)

    说起权限我们大家都知道,不一样的角色会有不一样的权限.比如就像学生管理系统一样,管理员,老师,学生之间的权限都是不一样的,那么展示的页面也是不一样的.所以,我们现在来看看具体操作. 目标:生成一个独立 ...

  2. String小案例(**)、包装类型和普通数据类型的转换(拆装箱)

    ###String用法: package StringTest; /**功能: * 判断Java文件名是否正确,判断邮箱格式是否正确 * 其中:合法的文件名应该以.java结尾 * 合法的邮箱名至少包 ...

  3. 软件工程 #02# Entity Relationship Diagram VS. 用 UML 中的类图表示 E-R 图

    不同的老师叫我们画 E-R 图居然是不一样的,于是我仔细研究了一番.. 通常所说的 E-R 图(外文全称 Entity Relationship Diagram,简称 ERD)长这个样子: 而有时候它 ...

  4. Python 内置函数sorted()在高级用法

    对于Python内置函数sorted(),先拿来跟list(列表)中的成员函数list.sort()进行下对比.在本质上,list的排序和内建函数sorted的排序是差不多的,连参数都基本上是一样的. ...

  5. python分割txt文件

    a=open('A.txt','r').readlines() n=3 #份数 qty=len(a)//n if len(a)%n==0 else len(a)//n+1 #每一份的行数 for i ...

  6. 详解centos6和centos7防火墙

    CentOS6.5查看防火墙的状态: ? 1 [zh@localhost ~]$service iptable status 显示结果: ? 1 2 3 4 5 6 7 8 9 [zh@localho ...

  7. Linux下的查找技巧

    Find知识点: -mtime ——修改时间 -ctime ——创建时间 -atime ——访问时间 mtime 举例说明: -mtime n : n为数字,意思为在n天之前的“一天之内”被更改过内容 ...

  8. python --- 06 小数据池 编码

    一.小数据池, id()    进行缓存 1.小数据池针对的是: int, str, bool 2.在py文件中几乎所有的字符串都会缓存.   在cmd命令窗口中几乎都不会缓存   不同的解释器有不同 ...

  9. CentOS7学习记录(工具使用篇)

    一.   远程连接终端中文乱码:如xShell 检查当前系统语言:echo $LANG 查看系统安装语言包:locale ,如果包含zh_CN.UTF-8表示已经安装中文语言.如果没有中文包,使用命令 ...

  10. 分块读取Blob字段数据(Oracle)

    试过了MSSQL的分块读取Blob字段,又尝试在Oracle下完成,发现还是可行的. 首先建立一个存储过程: create or replace procedure PRO_GET_BLOB(     ...