首页 > 其他分享 >设计模式-责任连

设计模式-责任连

时间:2024-10-13 17:43:59浏览次数:6  
标签:Filter filter 责任 filters import 设计模式 servlet javax

package com.example.cor.chain;

import com.example.cor.filter.Filter;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class ApplicationFilterChain implements FilterChain{



    private static final int INCREMENT = 10;


    // target
    private Servlet servlet;

    public void setServlet(Servlet servlet) {
        this.servlet = servlet;
    }

    // manage filters

    private Filter[] filters = new Filter[0];

    // filter count
    private int n;

    public void addFilter(Filter filter) {
        for (Filter f : filters) {
            if (f == filter) {
                return;
            }
        }

        // no capacity,
        if (n == filters.length) {
            Filter[] newFilters = new Filter[n + INCREMENT];
            System.arraycopy(this.filters,0,newFilters,0,n);
            filters = newFilters;
        }

        filters[n++] = filter;
    }

    // call next filter

    private int pos;// current filter index

    @Override
    public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {

        if (pos < n) {
            // call next filter
            Filter filter = filters[pos++];
            filter.doFilter(request,response,this);
            return;
        }
        // call target
        servlet.service(request,response);
    }



}
package com.example.cor.chain;

import com.example.cor.filter.Filter;

import javax.servlet.Servlet;

public class ApplicationFilterFactory {


    public static FilterChain createFilterChain(Servlet servlet, Filter ... filters) {
        if (servlet==null) {
            return null;
        }
        ApplicationFilterChain chain = new ApplicationFilterChain();
        chain.setServlet(servlet);
        // add filters
        for (Filter filter : filters) {
            chain.addFilter(filter);
        }
        return chain;
    }
}
package com.example.cor.chain;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public interface FilterChain {

    void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException;
}
package com.example.cor.filter;

import com.example.cor.chain.FilterChain;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public interface Filter {
    void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
}
package com.example.cor.filters;


import com.example.cor.chain.FilterChain;
import com.example.cor.filter.Filter;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class CostFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("CostFilter pre");
        chain.doFilter(request,response);
        System.out.println("CostFilter post");
    }
}

 

标签:Filter,filter,责任,filters,import,设计模式,servlet,javax
From: https://www.cnblogs.com/wscp/p/18462650

相关文章

  • 设计模式分类和软件设计原则
    1.设计模式分类类别名称描述设计模式创建型模式怎样创建对象,将对象的创建与使用分离单例、原型、工厂方法、抽象工厂、建造者结构型模式将类或对象按某种布局组成更大的结构代理、适配器、桥接、装饰、外观、亨元、组合行为型模式类或对象之间怎样相互协作......
  • 设计模式(二)
    第一类模式:创建者模式创建型模式的主要关注点是“怎么样创建对象?”,它的主要关注点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为:单例模式工厂方法模式抽象工程模式原型模式建造者......
  • 2006-2023年上市公司社会责任报告、ESG报告文本(TXT)
    2006-2023年上市公司社会责任报告、ESG报告文本(TXT)1、时间:2006-2023年2、范围:A股上市公司3、样本量:14279份4、说明:上市公司社会责任报告是企业对外公布的一份关于其社会责任实践和成果的详细文件,涵盖环境保护、社会贡献和公司治理等方面的表现。通常包含公司在减少环境影响......
  • C#设计模式详解:从简单工厂到抽象工厂
    在C#中,简单工厂(SimpleFactory)和抽象工厂(AbstractFactory)是两种常用的设计模式,它们都属于创建型设计模式,用于创建对象而无需在代码中显式指定具体的类。尽管它们的目的相似,但在复杂性和灵活性方面存在显著差异。简单工厂(SimpleFactory)简单工厂模式是一种不属于GoF(四人帮......
  • 设计模式11
    packagecom.example.principle.ocp;publicclassApiInfo{privateStringapi;privatelongrequestCount;privatelongerrorCount;privatelongdurationOfSeconds;//privatelongtimeoutCount;publicStringgetApi(){r......
  • 设计模式详解(命令模式)
    命令模式(CommandPattern)是一种行为型设计模式,它将请求封装为一个对象,从而使得请求的发送者和接收者解耦。一、命令模式的核心思想命令模式的核心思想是将“请求”封装成为一个对象,从而使得我们可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的......
  • 设计模式
    重点:单例模式、工厂方法模式、建造者模式、适配器模式(类/对象)、代理模式、装饰器模式、迭代器模式、模板方法模式、策略模式、责任链模式、观察者模式1、设计模式的分类创建型模式用于描述“怎么样创建对象”,它的主要特征是“将对象的创建与使用分离”。GOF书中提到了单例......
  • 前端开发设计模式——组合模式
    目录一、组合模式的定义和特点1.定义2.特点:二、组合模式的实现方式1.定义抽象组件类2.创建叶节点类3.创建组合类:三、组合模式的应用场景1.界面布局管理2.菜单系统构建3.组件库开发四、组合模式的优点1.简化客户端代码2.增强代码的可拓展性3.清晰的层次结构表示......
  • 重修设计模式-行为型-观察者模式
    重修设计模式-行为型-观察者模式Defineaone-to-manydependencybetweenobjectssothatwhenoneobjectchangesstate,allitsdependentsarenotifiedandupdatedautomatically.在对象之间订阅一个一对多的依赖,当一个对象状态改变时,它的所有依赖对象都会自动......
  • C++常用设计模式详解
    前言:本文详细解释几种常用的C++设计模式,都是平时项目中用的比较多的。本文针对每种设计模式都给出了示例,让你跟着代码彻底搞懂设计模式。Tips:如果是准备面试,不需要知道所有的设计模式,要深入理解下面几种常用即可,因为面试官会先问你了解哪些设计模式,然后从你了解的里面挑一......