职责链模式有这些特点:
- 需要解决一个问题
- 存在多个对象都可以解决这个问题
- 按照顺序依次排列对象(链条的特点)
拿数学函数举例,存在一个问题x,对应的解决方案有5种,分别是
- f1(x) 可以但不一定能解决问题,如果不能解决问题就调用f2(x)
- f2(x) 可以但不一定能解决问题,如果不能解决问题就调用f3(x)
- f3(x) 可以但不一定能解决问题,如果不能解决问题就调用f4(x)
- f4(x) 可以但不一定能解决问题,如果不能解决问题就调用f5(x)
- f5(x) 可以但不一定能解决问题,如果不能解决问题,则问题无法解决
调用方只允许调用f1(x)这个函数,调用方无需关心f2, f3, f4, f5链条的存在,只需要得到最终问题是否能够解决的结果即可。
体现职责链模式有下面几点
- f1, f2, f3, f4, f5都有职责解决问题x
- 链条体现在f1, f2, f3, f4, f5解决问题x必须按固定顺序进行尝试,比如按照f1, f2, f3, f4, f5的顺序
- 链条终止在问题x得到解决,如果所有方案都无法解决问题x,问题x则被标记为责任链无法解决
案例设计
异常的处理
比如程序中有个异常需要处理,对应可能的处理方式有5种,分别是f1(异常),f2(异常),f3(异常),f4(异常),f5(异常);
这个时候期望用职责链的模式来处理这个异常,需要按照下面的要求对这5个解决方案进行处理
- 对调用方只暴露f1这个解决方案
- 对解决方案按照f1, f2, f3, f4, f5进行排序
- 如果f1无法解决问题,则按照次序调用f2, f3, f4, f5尝试解决
代码实现
一些注意的点
- 这个职责链模式会增大代码调试的难度(多层调用)