JDK设计模式之——责任链

责任链的设计模式可以参考Servlet的FilterChain。FilterChain中的每个Filter(过滤器)就像一个个的链条

  • 接口Filter

  doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
          The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain.

  过滤器Filter中doFliter方法完成实际的过滤操作,通过参数FilterChain把多个过滤器串联起来。

  • 参数FliterChain

  doFilter(ServletRequest request, ServletResponse response) 
          Causes the next filter in the chain to be invoked, or if the calling filter is the last filter in the chain, causes the resource at the end of the chain to be invoked.

  执行fliterChain的doFilter方法,会执行下一个filter的doFilter方法同时FliterChain会当做参数传给下一个Filter。(Filter的执行循序 和在web.xml配置的顺序一致)

责任链设计模式的特点是


Filter1

code11

chain.doFilter()

code12


Filter2

code21

chain.doFilter()

code22

Servlet的request请求 Servlet的resopnse响应

执行code11后通过chain.doFilter()方法,

代码会到Filter2中去

然后执行code21(如果有下一个filter 会接着执行下一个filter)


执行完所有的过滤器之后 开始response返回

先从最末的一个过滤器开始返回

于是response时候的代码执行顺序是code22  code12

上面的执行顺序会是 code11 code21  code22 code12 FilterChain通过参数传递起到串联所有Filter的作用,通过执行chain.doFilter()来进入下一个Filter

代码证明:

1.首先声明一个Servlet

package javaee.net.cn.websocket;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet  extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {;
        System.out.println("doGet>>>>>>>>>>>>>>>>>>");
    }

}

2.声明两个过滤器

package javaee.net.cn.websocket;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class NoteFilter implements Filter {

    @Override
    public void destroy() {
        System.out.println("note destory<<<<<<<<<<<<<<<<");

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("request note filter");
        chain.doFilter(request, response);
        System.out.println("response note filter");

    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("note init<<<<<<<<<<<<<<");

    }

}
package javaee.net.cn.websocket;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class HtmlFilter implements Filter {

    @Override
    public void destroy() {
        System.out.println("html destory<<<<<<<<<<<<<<<<");

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("request html filter");
        chain.doFilter(request, response);
        System.out.println("response html filter");

    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("html init<<<<<<<<<<<<<<");

    }

}

3.在web.xml中配置Servlet和过滤器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Tab3</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
  </welcome-file-list>
  <filter>
      <filter-name>NoteFilter</filter-name>
      <filter-class>javaee.net.cn.websocket.NoteFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>NoteFilter</filter-name>
      <url-pattern>/myServlet</url-pattern>
  </filter-mapping>

   <filter>
      <filter-name>HtmlFilter</filter-name>
      <filter-class>javaee.net.cn.websocket.HtmlFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>HtmlFilter</filter-name>
      <url-pattern>/myServlet</url-pattern>
  </filter-mapping><!--上面配置fliter 下面配置Servlet -->
  <servlet>
      <servlet-name>MyServlet</servlet-name>
      <servlet-class>javaee.net.cn.websocket.MyServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>MyServlet</servlet-name>
      <url-pattern>/myServlet</url-pattern>
  </servlet-mapping>
</web-app>

4.浏览器输入web.xml配置的url路径:http://127.0.0.1:8080/myServlet

输出结果是:

request note filter
request html filter
doGet>>>>>>>>>>>>>>>>>>
response html filter
response note filter

和上面分析一致

原文地址:https://www.cnblogs.com/ssskkk/p/9226882.html

时间: 2024-08-02 07:08:24

JDK设计模式之——责任链的相关文章

设计模式之责任链模式20170717

行为型设计模式之责任链模式: 一.含义 责任链模式的核心在"链"上,"链"是由多个处理者(对象)组成的,由这条链传递请求,直到有对象处理它为止(在链中决定谁来处理这个请求),并返回相应的结果 二.代码说明 1.主要有两个角色 1)处理者 它能够对请求做出处理(请求得到处理则直接返回,否则传到下一个处理者),设置下一个处理者(这两个操作可以抽象出来), 同时每个处理者都有一个相应的处理级别,以及具体的处理操作(父类实现请求传递,子类实现请求处理) 2)被处理者(请求者

设计模式之责任链模式--- Pattern chain-of-responsibility

模式的定义 责任链模式定义如下: Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it. 使多个对象都有机会处理请求,从而避免请求的发送

设计模式_责任链模式

定义 Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象都有机会处理请求.从而避免了请求的发送者和接受者之间的耦合关系.

Java设计模式之责任链模式、职责链模式

本文继续介绍23种设计模式系列之职责链模式. 什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组. 职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 角色 抽象处理者角色(Handler):定义出一个处理请求的接口.如果需要,接口可以定义 出一个方法以设定和返回对下家的引用.这个角色通常由一个Java抽象类或者Java接口实现. 具体处理者角色(ConcreteHan

C#设计模式:责任链模式

设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了,因为最近在设计“网关API”组件(后续介绍),采用“责任链设计模式”进行设计,所以先进行回顾记录.  一.责任链模式介绍 责任链模式是指一个处理需要涉及多个过程或者角色参与处理,并基于某个约定组成一个链,每个过程或者角色拥有各自职责进行处理.责任链模式有效组织一个过程处理,同时子过程之间职责明确.

Java设计模式之责任链设计模式

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将所有处理对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. ? 请求传递方向:从低级到高级 ? 重点:如何形成这个责任链 ? 特点:发出处理请求的客户端并不知道是系统当中的哪一个对象最终处理这个请求,这样系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任.1. 派生类中都具备的功能(1) 都要设置后继者(一样)(2) 都能实现自己职责范围

设计模式之责任链

刚刚认真开始学java不超过半年时间,现在在学习struts2框架,接触到了责任链这个设计模式,并通过这个模式似乎明白了aop切面编程,因为如果没有责任链存在的话,则程序不会从中被断很多次,但是有了这个链子,就像把一个很流畅的程序切了很多次一样,我很喜欢这个名字,话不多说了,介绍责任链:(下面这个例子是看马士兵老师的视频里面讲到的) 比如要写一个论坛,论坛上肯定是要发帖子的,我们想对刚发的帖子进行检查,看是不是有脚本程序,或者对一些敏感的词进行过滤,可以设计如下: 定义一个接口Filter:让每

【GOF23设计模式】责任链模式

来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_责任链模式.公文审批.供应链系统的采购审批.异常链.过滤器和拦截器调用过程 1 package com.test.chainOfResp; 2 /** 3 * 封装请假的基本信息 4 */ 5 public class LeaveRequest { 6 private String empName; 7 private int leaveDays; 8 private String reason; 9 10 publi

【JS设计模式】责任链设计模式的代码示例

责任链设计模式: 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任. 责任链模式涉及到的角色如下所示:● 抽象处理者(Handler)角色:定义出一个处理请求的接口.如果需要,接口可以定义 出一个方法以设定和返回对下家的引用.这个角色通常由一个Java抽象类或者Java接口实现.上图中Handle