职责链设计模式

2019/6/10 posted in  设计模式

职责链模式有这些特点:

  1. 需要解决一个问题
  2. 存在多个对象都可以解决这个问题
  3. 按照顺序依次排列对象(链条的特点)

拿数学函数举例,存在一个问题x,对应的解决方案有5种,分别是

  1. f1(x) 可以但不一定能解决问题,如果不能解决问题就调用f2(x)
  2. f2(x) 可以但不一定能解决问题,如果不能解决问题就调用f3(x)
  3. f3(x) 可以但不一定能解决问题,如果不能解决问题就调用f4(x)
  4. f4(x) 可以但不一定能解决问题,如果不能解决问题就调用f5(x)
  5. f5(x) 可以但不一定能解决问题,如果不能解决问题,则问题无法解决

调用方只允许调用f1(x)这个函数,调用方无需关心f2, f3, f4, f5链条的存在,只需要得到最终问题是否能够解决的结果即可。

体现职责链模式有下面几点

  1. f1, f2, f3, f4, f5都有职责解决问题x
  2. 链条体现在f1, f2, f3, f4, f5解决问题x必须按固定顺序进行尝试,比如按照f1, f2, f3, f4, f5的顺序
  3. 链条终止在问题x得到解决,如果所有方案都无法解决问题x,问题x则被标记为责任链无法解决

案例设计

异常的处理

比如程序中有个异常需要处理,对应可能的处理方式有5种,分别是f1(异常),f2(异常),f3(异常),f4(异常),f5(异常);

这个时候期望用职责链的模式来处理这个异常,需要按照下面的要求对这5个解决方案进行处理

  1. 对调用方只暴露f1这个解决方案
  2. 对解决方案按照f1, f2, f3, f4, f5进行排序
  3. 如果f1无法解决问题,则按照次序调用f2, f3, f4, f5尝试解决

代码实现


一些注意的点

  1. 这个职责链模式会增大代码调试的难度(多层调用)

参考资料