这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战
概述
责任链模式(Chain of Responsibility Pattern)因翻译问题又称为职责链模式,当多个对象都有可能接收请求时,它将这些对象连成一条链,并且沿着这条链传递请求,直到处理完毕,避免了请求者与接收者的耦合。
责任链模式模式分为纯的责任链模式和不纯的责任链模式。纯的责任链模式:要么承担全部责任,要么将责任转发;不纯的责任链模式:允许某个请求被一个具体处理者部分处理后再向下传递,或者一个具体处理者处理完某请求后,其后继处理者可以继续处理该请求,并且一个请求最终可以不被任何处理者所接收。例如:张三开了一家水壶制造厂,水壶需要抛光和镀漆,水壶先被抛光然后被镀漆,这个两个工艺也可以都不执行,这就是不纯的责任链模式;每个水壶都需要包装,一个水壶在流水线上传送,若前一个员工来不及处理就会传送到下一个员工,一个水壶只会被一名员工进行包装,这就是纯的责任链模式。
结构
- Handler(抽象处理者):一般为抽象类或接口,定义了抽象请求处理方法和抽象处理者类型的对象,通过对对象的引用,处理者可以连成一条链。
- ConcreteHandler(具体处理者):抽象处理者的子类,实现了抽象处理者中定义的抽象请求处理方法,可以处理用户的请求。
优点
- 实现了请求和处理的解耦,请求者不用知道是谁处理的,处理者不用知道请求的全貌。
- 系统可以在不影响客户端的情况下动态地重新组织链和分配责任,灵活性更高。
- 在系统中增加具体处理者时,无须修改原有系统的代码,符合开闭原则。
缺点
- 每个请求都是从链头到链尾依次执行,当链比较长时,性能较差。
- 不易测试,给程序的调试增加了难度。
- 如果建链不当,可能会导致系统陷入死循环。
应用场景
- 有多个对象可以处理同一个请求,具体哪个对象处理该请求需要在运行时才能确定,客户端只需将请求提交到链上,而无须关心请求的处理对象是谁以及它是如何处理的。
- 在不明确指定接收者的情况下,向多个对象中的一个提交请求。
- 可动态指定一组对象处理请求,客户端可以动态创建职责链来处理请求,还可以改变链中处理者之间的先后次序。
JDK 中的应用
在 JDK 中 java.util.logging.Logger#log() 和 javax.servlet.Filter#doFilter() 都使用了责任链模式。