什么叫责任链模式:
事件对象,要交给多个处理器处理,我们管理处理器按顺序执行时间对象,一次调用即可的方式
1.责任链模式的应用:
1.拦截器,filter过滤器
2.责任链模式的元素
1.事件对象
2.处理器
3.管理处理器的顺序问题
3.处理器的管理的几种方式
1.list集合:将处理器用list集合保存,解决顺序问题
2.引用:一个处理器指向下一个处理器
4.处理器如何判断是否处理事件对象,以及是否如何调用下一个处理器
1.每一个责任链模式的应用都需要 考虑是否处理事件对象,以及是否调用下一个处理器
2.但是,事件对象不管符不符合,都得先传到处理器的方法中去,然后判断是否符合,符合那么处理器处理,不符合返回原事件对象
3.但是,不是每个handler都暴露出来了,例如filter中 doFilter不是handler,handler没有暴露出来
它的handler就是判断,request的mapping是否满足这个filter,如果是,调用
doFilter执行,如果不是,直接返回原 request对象,给下一个filter
4.所以,事件对象的判断是否处理与否,都应该在handler中判断
5.但是,有的应用,提供给你了,责任链,当这个处理器符合时,执行处理,
执行完,你可以通过提供给你的责任链,看你自己想不想继续走 下一个处理器
如果不提供,那么一定会把所有处理器走完,只是每个处理器可能处理,可能不处理
6.2个例子2种不同的解决思路
1.拦截器
拦截器的handler方法暴露出来了
拦截器没有提供 责任链给开发者
所以,每个处理器都要走,并且每个处理器的判断都要自己写,执行完就进入下一个处理器,
并且处理器的方法只能,全部执行完,然后返回结果给下一个处理器
2.filter过滤器
filter的handler方法 没有 暴露出来了
filter 提供 责任链给开发者
所以,每个处理器都是自己判断执行与否,不执行下一个处理器,执行
就可以进入 暴露给你的 doFilter方法,这时你可以判断是否要 进入下一个处理器
并且,正因为你可以写代码判断是否进入下一个处理器,这样你就可以写前置处理-->下一个处理器-->后置处理
责任链中处理器的 两种 调用方式
1.主程序中 调用一个处理器的方法,处理完结果,返回给主程序,然后主程序在把这个结果,传给下一个 处理器执行(拦截器)
2.主程序 调用一个处理器的方法,在这个处理器的方法中 判断是否调用下一个处理器的方法,这样始终只有一个栈(filter)
3.上面这两种 主要的区别是 看 组件 是否 给你 你责任链,让你有能力判断是否执行下一个处理器的方法
并且,如果提供你责任链,你不仅有能力决定是否,停止执行下一个处理器,同样
正因为它 一个 栈的 调用方法,让你可以写 前置处理,和 后置处理,你可处理一半
然后,调用下一个处理器的方法(此时这个方法还没有结束)等下一个方法执行完返回结果,你再执行 后置代码