责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
责任链模式的要点
有多个对象共同对一个任务进行处理。
这些对象使用链式存储结构,形成一个链,每个对象知道自己的下一个对象。
一个对象对任务进行处理,可以添加一些操作后将对象传递个下一个任务。也可以在此对象上结束任务的处理,并结束任务。
客户端负责组装链式结构,但是客户端不需要关心最终是谁来处理了任务。
涉及角色
- 抽象处理者角色(Handler:Approver):定义一个处理请求的接口,和一个后继连接(可选)
- 具体处理者角色(ConcreteHandler:President):处理它所负责的请求,可以访问后继者,如果可以处理请求则处理,否则将该请求转给他的后继者。
- 客户类(Client):向一个链上的具体处理者ConcreteHandler对象提交请求。
实现1 Handler
一个简单的处理数字的demo:
抽象处理者Handler:
具体处理者角色1:处理大于10的数
具体处理者角色2:处理0-10之间的数
具体处理者角色3:用于处理负数
客户类(测试类):
运行结果:
|
|
实现2 Filter
Sevlet中的filter在web开发中可以对web请求做各种处理和过滤,包括:对请求和相应的字符集处理、对跨站脚本攻击的过滤、获取客户端真实ip地址等
过滤器接口:
过滤器链:
实现两个过滤器:
测试:
运行结果:
使用场景
在工作中,尤其是java web开发中,有两个地方明显使用责任链模式,一个是filter,一个是listener,filter的自定义在web开发中可以对web请求做各种处理和过滤,包括:对请求和相应的字符集处理、对跨站脚本攻击的过滤、获取客户端真实ip地址、获取客户证书、防止盗链等等.
filter的责任链实现与责任链模式的标准代码有着一定的差距,它具有如下特点:
责任链的实现并不是链式结构,而是以一个FilterChain保存了所有责任链的引用,通过FilterChain的doFilter方法依次调用filter进行执行;
filter中同时也保存了FilterChain的引用,形成了一个双向引用;
FilterChain将加入容器中的filters按照顺序进行调用执行
由此,责任链模式的实现应该有多种形式,可以为责任链之间的互相链式引用,也可以为第三方集合中的顺序执行方式