【设计模式】聊聊职责链模式

原理和实现

模板模式变化的是其中一个步骤,而责任链模式变化的是整个流程。

将请求的发送和接收解耦合,让多个接收对象有机会可以处理这个请求,形成一个链条。不同的处理器负责自己不同的职责。

定义接口

cpp 复制代码
public interface Filter {

    /**
     *  执行过滤方法
     * @param request
     * @param response
     * @param filterChain
     */
    void doFilter (Request request, Response response,FilterChain filterChain);
}

定义职责链

通过内部一个链表 将职责链添加到对应的链表中

cpp 复制代码
public class FilterChain implements Filter{

    private static List<Filter> filterList = new LinkedList<>();

    private Filter myFilter;

    private static int filterIndex = 0;

    /**
     * 添加一个职责工作链
     * @param filter
     */
    public void addFilter (Filter filter) {
        filterList.add(filter);
    }

    public void addMyFilter (Filter filter) {
        myFilter = filter;
    }

    @Override
    public void doFilter(Request request, Response response, FilterChain filterChain) {
        if (filterIndex < filterList.size()) {
            Filter filter = filterList.get(filterIndex);
            filterIndex++;
            filter.doFilter(request,response,filterChain);
        } else {
            myFilter.doFilter(request,response,filterChain);
        }
    }
}
cpp 复制代码
public class HttpFilter implements Filter{

    @Override
    public void doFilter(Request request, Response response, FilterChain filterChain) {
        System.out.println("httpFilter before...");
        filterChain.doFilter(request,response,filterChain);
        System.out.println("httpFilter after...");
    }
}
cpp 复制代码
public class MyFilter implements Filter{

    @Override
    public void doFilter(Request request, Response response, FilterChain filterChain) {
        System.out.println("MyFilter before...");
        System.out.println("hahaha 我是中间执行人");
        System.out.println("MyFilter after...");
    }
}
cpp 复制代码
public class EncodingFilter implements Filter{

    @Override
    public void doFilter(Request request, Response response, FilterChain filterChain) {
        System.out.println("EncodingFilter before...");
        filterChain.doFilter(request,response,filterChain);
        System.out.println("EncodingFilter after...");
    }
}
cpp 复制代码
	public static void main(String[] args) {
        FilterChain filterChain = new FilterChain();

        Filter httpFilter = new HttpFilter();
        Filter encodingFilter = new EncodingFilter();
        Filter myFilter = new MyFilter();

        filterChain.addFilter(httpFilter);
        filterChain.addFilter(encodingFilter);
        filterChain.addMyFilter(myFilter);

        filterChain.doFilter(new Request(),new Response(),filterChain);

    }

其实不管是模板模式、策略模式、职责链模式 本质都是为了提高代码的拓展性、应对代码的复杂性,并且如果新增一个过滤器,那么只需要进行拓展、也满足开闭原则。

在实际的工作中,需要考虑什么场景下符合,就采用对应的设计模式,而不要乱用。

servlet中Filter就是职责链的体现。

相关推荐
十年Java程序媛15 分钟前
Java 多线程基础与锁机制详解|进程线程、锁升级、synchronized 与 Lock 对比
java·开发语言·spring boot
弯_弯16 分钟前
FDE 的工程能力画像:数据接入、PoC 与可复用资产的落地口径
java·服务器·开发语言
云和数据.ChenGuang2 小时前
print(f“a+b=“,result) print(f“a+b={result}“)区别
java·前端·人工智能·python·深度学习
2601_962885722 小时前
如何用 Python 算最大回撤和回撤恢复期?
java·数据库·python
代钦塔拉2 小时前
【C++/Qt 进阶】设计模式系列(4):原型模式——用“克隆“代替“重新构造“
c++·qt·设计模式
毕业设计7032 小时前
(免费领源码)SSM董家湾线上点餐系统04682- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
java·redis·mysql·tomcat·maven·mybatis·ssm
Q26433650233 小时前
【有源码】基于SpringBoot+Vue的居民健康体检与慢病干预管理系统-面向智慧医疗的体检预约与健康知识服务平台
java·vue.js·spring boot·mysql·毕业设计·javaweb·课程设计
悠仁さん3 小时前
非类型模板参数的特化与偏特化
java·数据结构·算法
鬼手点金3 小时前
上下文:Agent 的眼睛
java·前端·人工智能·git·深度学习