浅析设计模式:责任链模式(Chain of Responsibility)

  先来看一个案例:

浅析设计模式:责任链模式(Chain of Responsibility)_第1张图片

     上述案例在现实生活中更像是一种"推卸责任"的行为,但在编程世界中,我们也许需要这种"推卸责任"的模式。这就是我们接下来要讨论的责任链模式(Chain of Responsibility )。

什么是责任链模式?

将用于解决问题的对象(Handler)组成一条职责链,对于每一个对象,当自己能够解决问题时就必须解决,否则将问题传递给职责链中的下一个对象,即按照对象在职责链中的顺序,一个个的找出第一个能解决问题的对象,这种模式就是责任链模式。


责任链模式中的角色:

  • Handler:表示处理器这一类角色,它声明了处理请求的接口(API),并且知道当自己解决不了问题时,应该委托给下一个处理器。
  • ConcreteHandler:表示具体的处理器,实现了Handler中声明的抽象方法。
  • Client:请求发起者,即向第一个ConcreteHandler发起请求的角色。


责任链模式的类图:

浅析设计模式:责任链模式(Chain of Responsibility)_第2张图片

我们来编写一个示例程序:

1、创建一个表示问题的类

浅析设计模式:责任链模式(Chain of Responsibility)_第3张图片

2、编写一个表示Handler的类

    这是一个抽象类,next属性是责任链中相对一自己的下一个处理器,support方法是对外开放的用于处理问题的方法,在其内部调用了resolve方法,resolve方法的有子类处理器提供具体的实现。

浅析设计模式:责任链模式(Chain of Responsibility)_第4张图片

3、编写表示ConcreteHandler角色的类

这里提供了4个用于处理特定问题的处理器

浅析设计模式:责任链模式(Chain of Responsibility)_第5张图片

4、编写测试程序

TestDemo实际上充当了Client的角色

浅析设计模式:责任链模式(Chain of Responsibility)_第6张图片

    结果如上图所示,在一条责任链中,若当前处理器无法处理请求,它会委派给下一个处理器,当最后一个处理器都不能解决问题,则会打印错误信息。

最后小结:

1、责任链模式弱化了发起请求的人与处理请求的人之间的关系

Client发起请求,该请求会沿着职责链传播,直到找到第一个能够处理该请求的ConcreteHandler,这样Client不需要知道具体是哪个ConcreteHnadler能够处理请求,而ConcreteHandler也不需要知道是谁发起了请求。否则,发起请求的人就必须知道谁能够处理请求,二者就形成了一种关联关系。

2、责任链模式实际上使得各个处理器的职责更加明确,而非真正的推卸责任

    责任链上的每一个处理器都只专注于自己能够解决的问题,对那些自己处理不了的问题,会毫不犹豫(带感情色彩)地委托给下一个处理器。

3、责任链模式一定程度上造成延时

    相比于请求人与处理人一一对应的情况来说,请求在责任链上传播,会延迟了请求的处理,当然这需要根据具体情况去权衡,在请求人与处理人关系明确且需要快速处理请求的情况下,不推荐使用责任链模式。


Ending ...

你可能感兴趣的:(设计模式)