责任链模式(Chain of Responsibility)的目标是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
在处理用户的请求时可能要根据不同的情况对请求添加不同的处理逻辑,在这时候就可以利用责任链进行设计。当需要添加一个处理逻辑时可以很方便的添加一个处理的节点。
现在我们的需求是处理用户的请求,将用户提交的字符串信息进行层层处理,同时在处理完成之后返回结果时,也要对返回的字符串进行层层处理,而处理返回的情况时其处理的顺序和先前是正好相反的顺序。
首先建立用户的请求和接收对象Request和Response:
- package com.lcq.filter;
-
-
public class Request {
- String requestStr;
-
-
public String getRequestStr() {
-
return requestStr;
- }
-
-
public void setRequestStr(String requestStr) {
-
this.requestStr = requestStr;
- }
-
- }
- package com.lcq.filter;
-
-
public class Response {
- String responseStr;
-
-
public String getResponseStr() {
-
return responseStr;
- }
-
-
public void setResponseStr(String responseStr) {
-
this.responseStr = responseStr;
- }
-
- }
我们将处理用户信息的逻辑抽象成为一个个的过滤器,进一步抽象出过滤器接口Filter:
- package com.lcq.filter;
-
-
public interface Filter {
-
public void doFilter(Request request, Response response,FilterChain chain);
-
- }
注意在Filte接口中doFilter方法参数中有FilterChain的一个变量,我们再建立FilterChain类:
- package com.lcq.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);
- }
- }
在FilterChain中继承了Filter接口,从而实现了doFilter方法,在FilterChain中又有一个index变量,该变量是用来标记当前访问的是哪一个过滤器,这些过滤器是存放在ArrayList中的,这样用户在使用的时候就可以实现自己的过滤器,编写自己的处理逻辑,从而将自己的过滤器添加到ArrayList中,再调用FilterChain的doFilter方法遍历整个责任链。
下面我们编写三个过滤器:
HTMLFilter类:
- package com.lcq.filter;
-
-
-
-
-
-
-
public class HTMLFilter implements Filter {
-
-
@Override
-
public void doFilter(Request request, Response response,FilterChain chain) {
-
request.requestStr = request.getRequestStr().replace("<", "[")
-
.replace(">", "] --------HTMLFilter");
- chain.doFilter(request, response, chain);
-
response.responseStr += "--------HTMLFilter";
-
- }
-
- }
SesitiveFilter类:
- package com.lcq.filter;
-
-
public class SesitiveFilter implements Filter {
-
-
@Override
-
public void doFilter(Request request, Response response, FilterChain chain) {
-
request.requestStr = request.getRequestStr().replace("敏感", " ")
-
.replace("猫猫", "haha------SesitiveFilter");
- chain.doFilter(request, response, chain);
-
response.responseStr += "------SesitiveFilter";
-
- }
-
- }
FaceFilter类:
- package com.lcq.filter;
-
-
public class FaceFilter implements Filter {
-
-
@Override
-
public void doFilter(Request request, Response response, FilterChain chain) {
-
request.requestStr = request.getRequestStr().replace(":)",
-
"^V^-------FaceFilter");
- chain.doFilter(request, response, chain);
-
response.responseStr += "-------FaceFilter";
-
- }
-
- }
最后编写测试类:
- package com.lcq.filter;
-
-
public class Main {
-
public static void main(String[] args) {
-
String message = "敏感词汇,重庆,<script> 躲猫猫 :)";
-
Request request = new Request();
- request.setRequestStr(message);
-
Response response = new Response();
-
response.setResponseStr("response");
-
FilterChain fc = new FilterChain();
-
fc.addFilter(new HTMLFilter()).addFilter(new SesitiveFilter());
-
-
FilterChain fc2 = new FilterChain();
-
fc2.addFilter(new FaceFilter());
- fc.addFilter(fc2);
- fc.doFilter(request, response,fc);
-
System.out.println("request = " + request.getRequestStr());
-
System.out.println("response = " + response.getResponseStr());
- }
-
- }
在上面的实例中应该注意两个地方:
1.我们建立的FilterChain中继承了Filter接口,所以在测试类中就可以像使用其他的过滤器一样使用FilterChain,大大提高了灵活性;
2.对于实现责任链的访问处理顺序问题,该问题的解决使用的是递归的思想,从而使先调用的结点在处理返回结果时其调用过滤器的顺序是相反的。这种解决方案在Struts和其他框架中实现过滤器和拦截器使用的较为普遍,并且十分巧妙。
分享到:
相关推荐
JAVA 设计模式: 工厂模式 代理模式 迭代模式 责任链模式 源码
java设计模式之责任链模式,从实际生活入手说明责任链模式的原理。
设计模式之责任链模式Java版本实现和UML类图设计
Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...
实验十:责任链模式.rar之java设计模式实验十:责任链模式.rar之java设计模式
java常用设计模式-责任链模式
开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒,这是很典型的行为责任链模式。 State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的处理操作的问题,而这样的...
目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式
章节介绍:1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之...
java 设计模式 责任链模式,希望对大家理解设计模式有帮助
【Java设计模式】(3)责任链Chain of Responsibility源码
NULL 博文链接:https://stelin.iteye.com/blog/932101
Java设计模式责任链模式共7页.pdf.zip
java设计模式示例 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。 行为型...
JAVA-设计模式-行为型模式-责任链模式
总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...
压缩包里是我自己写的管道模式、单例模式的代码;你需要copy到你自己eclipse建的工程文件中。另外,我把我的代码说明,写在了readme.txt文件里,偷懒以及求快的人看看...如果有问题,可留言。另外我分数高,但绝对有...
主要介绍了JAVA设计模式之责任链模式详解,需要的朋友可以参考下