责任链版本-1
意图:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止
适用性:
- 有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定
- 你想在不明确接收者的情况下,向多个对象中的一个提交一个请求
- 可处理一个请求的对象集合应被动态指定
责任链(Chain of Responsibility)模式的构成:
- 传递者接口(Handler):定义一个处理请求的接口,实现链中下一个对象(可选)
- 具体传递者(ConcreteHandler):可以访问链中下一个对象,如果可以处理请求,就处理它,否则将请求转发给后继者
- 客户端(Client):向链中的对象发出请求
示例如下:
传递者接口:
具体传递者FilterA:
具体传递者FilterB:
具体传递者FilterC:
测试:
控制台:
小结:和链表类似每个对象都有一个后继,每个对象都可以决定自己来处理还是由后继来处理
责任链版本-2
Java Web中的过滤器其实就是用到了责任链设计模式,我们这里来简单的模拟一下:
传递者接口:
FilterChain接口:
FilterChain实现类:
MyFilterA:
MyFilterB:
MyFilterC:
测试类:
控制台:
小结:对比第一版的责任链,它取消了每一个对象都维持后继对象这一特点,而是改用一个数组或集合来进行统一管理,数组或集合被封装进一个ApplicationFilterChain对象,它是FilterChain的实例,对Filter接口方法doFilter增加了一个参数,类型为FilterChain,这样我们就可以通过FilterChain类型的参数来间接获取后继Filter并执行它的doFilter方法,实现请求传递