设计模式之责任链模式

  责任链模式,属于行为型设计模式,为请求创建了一个接收者对象的链,主要是对请求的发送者和接收者进行解耦。

  定义:责任链是一条由很多对象组成的链,链中的每个对象,除了最后一个对象外,都持有对下一个对象的引用,请求会在这个链上传递,直到链上的某个对象决定处理此请求为止。

  问题描述:通常做法,每一个请求的发送者和接收者都会一一对应的耦合在一起,使得系统不够灵活。

  解决方案:让多个接收者都有可能接收到请求,连接成一条链,请求沿着这条链传递,直到有对象来处理它为止,这就是责任链设计模式。

  结构图

  举个栗子:讲一个评分审核的故事。。。

  现在,我们公司有一个自评规则:当自评分数小于60分时,由系统审核;60~70分,由组长审核;70~80分由主管审核;80~90分,由总监审核;90~100分,由经理审核。这条自评规则中,每个角色都是一个处理者,我们可以将这些处理者放在一条责任链上,发送一个带有分数参数的请求,在这条链上进行传递,直到某一个角色决定处理为止。具体实现方式如下:

  1. 新建一个抽象处理者类ChainHandler,定义了处理数据的业务方法和设定和返回对下一个对象的引用方法。代码如下:

      

  2. 分别新建具体处理者类,均继承上面的抽象接口ChainHandler。代码如下:

      

          

  3. 在使用者类中定义责任链的传递路径,并传入分数进行处理。代码如下:

          

  4. 运行后的效果,如图所示:

      

  以上,我们就将请求和处理进行了解耦,请求者不需要知道是谁来处理的,处理者也不需要知道是谁发送的请求,只要符合自己的规则就进行相应的处理,并且这个责任链可以动态地添加或删除,也可以改变一个请求的处理过程,提高了系统的灵活性。

  我们发现使用者中,我们要去挨个儿创建责任链上的每一个对象,然后又逐个设定一个对象对下一个对象的引用,如果责任链相同的话,多个使用者就要多次编写同样的代码,那么我们可以使用代理模式来解决这个问题,将这个对象的创建和责任链的形成放在代理类中进行,具体实现方式如下:

  5. 新建一个代理类ChainProxyHandler,同样继承抽象接口ChainHandler,并持有责任链上第一个对象的引用。代码如下:

         

  6. 在使用者类中使用代理类来实现同样的功能。代码如下:

     

  7. 运行后的效果,如图所示:

         

  以上,我们就可以重用这个代理类,只要传入相应的参数即可,具体处理操作,由具体处理者来进行。如果需要改变责任链中对象的顺序,可以在代理类中进行修改,也可以增加新的方法。

 

  优点

  1. 将请求者和接收者解耦,请求者不知道是被哪个接收者处理的,而接收者也不知道是谁发送的请求;

  2. 增强了系统的灵活性,可以动态地添加或删除责任链,可以改变一个请求的处理过程。

  缺点

  1. 请求不一定被处理;

  2. 使用不当可能会造成死循环;

  3. 如果责任链比较长,可能会影响到系统性能。

 

  适用场景

  1. 有多个对象可以处理同一请求,而具体哪个对象处理由运行时决定,而被处理的对象不需要关心谁处理。

  2.  可以动态地指定一组请求处理类,并且可以动态的管理这些类。

  

posted @ 2017-04-27 15:04  chenxkang  阅读(191)  评论(0编辑  收藏  举报