责任链设计模式

简介: 责任链设计模式思想与实现掌握后可以对 Servlet API 中的 Filter or HttpFilter 和 各种 MVC 框架中的拦截器会有自己一定的认知

责任链的应用场景

  • Servlet API 中的 Filter 过滤器
  • MVC 框架中的拦截器
  • . . .

filter

简单使用责任链模式拆分 Servlet API 中的过滤器

模拟 Servlet 中的 Request 对象

/**
 * @desc <b>模拟 Servlet 中的 Request 对象</b>
 * 
 * @author jiang ru yi
 */
public class HttpServletRequest {

    private String requestContext;
    private Map<String, Object> requestParam = new HashMap<>();

    public String getRequestContext() {
        return requestContext;
    }

    public void setRequestContext(String requestContext) {
        this.requestContext = requestContext;
    }

    public void setRequestParam(Map<String, Object> requestParam) {
        this.requestParam = requestParam;
    }
    
    public Object setAttribute(String key, Object value) {
        return requestParam.put(key, value);
    }
    
    public Object getAttribute(String key) {
        return requestParam.get(key);
    }
    
    public Object removeAttribute(String key) {
        return requestParam.remove(key);
    }
    
}

模拟 Servlet 中的 Response 对象

/**
 * @desc <b>模拟 Servlet 中的 Response 对象</b>
 * 
 * @author jiang ru yi
 */
public class HttpServletResponse {

    private String responseContext;

    public String getResponseContext() {
        return responseContext;
    }

    public void setResponseContext(String responseContext) {
        this.responseContext = responseContext;
    }

}

过滤器抽象层

/**
 * @desc <b>公用的过滤器抽象层</b>
 * 
 * @author jiang ru yi
 */
public abstract class HttpFilter {
    
    public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain);

}

过滤器调度

/**
 * @desc <b>过滤器的调度器</b>
 * 
 * @author jiang ru yi
 */
public class FilterChain {

    private List<HttpFilter> filters = new ArrayList<>();
    private int currFilter;

    public boolean addFilter(HttpFilter filter) {
        return filters.add(filter);
    }
    
    public boolean removeFilter(HttpFilter filter) {
        return filters.remove(filter);
    }
    
    public void doFilter(HttpServletRequest request, HttpServletResponse response) {
        if (currFilter++ == filters.size()) return;
        
        filters.get(currFilter - 1).doFilter(request, response, this);
    }

}

Junit 测试

public static void main(String[] args) {
    HttpServletRequest request = new HttpServletRequest();
    request.setRequestContext("<EvE>, Y(OvO)Y");
    request.setAttribute("user", "administrator");

    HttpServletResponse response = new HttpServletResponse();

    FilterChain chain = new FilterChain();
    chain.addFilter(new CharacterSetFilter());
    chain.addFilter(new PowerFilter());

    chain.doFilter(request, response);

    System.out.println(request.getRequestContext());
}

抽象层子类 : 字符过滤器

/**
 * @desc <b>过滤请求中的危险符号( < > )</b>
 * 
 * @author jiang ru yi
 */
public class CharacterSetFilter extends HttpFilter {

    @Override
    public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {
        String context = request.getRequestContext();
        String result = context.replaceAll("<", "&le;").replaceAll(">", "&lt;");
        request.setRequestContext(result);
        chain.doFilter(request, response);
    }

}

抽象层子类 : 校验用户是否登录

/**
 * @desc <b>过滤用户是否登录</b>
 * 
 * @author jiang ru yi
 */
public class PowerFilter extends HttpFilter {

    @Override
    public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {
        Object attribute = request.getAttribute("user");
        if (null != attribute) {
            chain.doFilter(request, response);
        } else {
            throw new RuntimeException("user not login");
        }
    }

}
目录
相关文章
|
8月前
|
设计模式 Java
常用设计模式(工厂方法,抽象工厂,责任链,装饰器模式)
有关设计模式的其他常用模式请参考 单例模式的实现 常见的设计模式(模板与方法,观察者模式,策略模式)
80 2
|
4月前
|
设计模式 存储 算法
设计模式——责任链
OA系统的采购审批项目、职责链模式基本介绍、职责链模式解决 OA 系统采购审批项目
设计模式——责任链
|
8月前
|
设计模式 安全 Java
设计模式之责任链 Chain Of Responsibility
设计模式之责任链 Chain Of Responsibility
50 1
|
8月前
|
设计模式
【设计模式】张一鸣笔记:责任链接模式怎么用?
【设计模式】张一鸣笔记:责任链接模式怎么用?
54 1
|
8月前
|
设计模式 Java Spring
责任链设计模式详解
该内容主要介绍了如何使用Java实现责任链模式。
69 4
|
8月前
|
设计模式 算法 调度
行为型设计模式:模板设计模式/观察者设计模式/策略设计模式/责任链设计模式
行为型设计模式:模板设计模式/观察者设计模式/策略设计模式/责任链设计模式
71 0
|
8月前
|
设计模式
二十三种设计模式全面解析-职责链模式(Chain of Responsibility Pattern):解放代码责任链,提升灵活性与可维护性
二十三种设计模式全面解析-职责链模式(Chain of Responsibility Pattern):解放代码责任链,提升灵活性与可维护性
128 0
|
设计模式 Java 数据库连接
JAVA设计模式8:装饰模式,动态地将责任附加到对象上,扩展对象的功能
JAVA设计模式8:装饰模式,动态地将责任附加到对象上,扩展对象的功能
|
设计模式 前端开发 数据安全/隐私保护
前端通用编程基础的设计模式之责任链
在前端开发中,我们常常需要处理一些复杂的业务逻辑,例如表单验证、权限控制等。这些业务逻辑可能需要经过多个步骤才能完成,每个步骤都需要进行具体的处理和判断。这时候就需要使用责任链模式来实现业务逻辑的流程化和扩展性。
145 0
|
设计模式 分布式计算 大数据
大数据开发基础的设计模式的责任链
当涉及大数据的开发时,设计模式是至关重要的。其中一种常见的设计模式是责任链模式,它可以有效地处理多个对象之间的请求。
98 0

热门文章

最新文章

  • 1
    设计模式转型:从传统同步到Python协程异步编程的实践与思考
    64
  • 2
    C++一分钟之-设计模式:工厂模式与抽象工厂
    55
  • 3
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    63
  • 4
    C++一分钟之-C++中的设计模式:单例模式
    79
  • 5
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    49
  • 6
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    81
  • 7
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    70
  • 8
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    54
  • 9
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    63
  • 10
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    137