职责链模式

CoderBuff CoderBuff     2022-08-08     665

关键词:

所谓职责链模式,其实在现实中非常常见,比如你要提出一个申请,首先可能通过你的组长,你的组长没有权力审批时会上报到经理,经理没有权力审批时上报到总监,总监没有没有权力审批时上报到总经理等等,以此类推直到有权力的管理者来审批。

这种场景我们可以用if-else判断分支来实现,不过记住大量的if-else判断分支并不是一个好的设计,此时我们可以采用“职责链模式”来解决。

首先不管领导是谁,他们都是管理者,那么我们抽象出一个管理者公共抽象类,如下图所示:

职责链模式中有很重要的一点就是,当该处理类没有权限不能处理此请求时需要将请求传递给下一个处理类,以此类推,直到有权限处理类处理该请求时即停止将请求传递给下一个处理类。所以我们画出职责链模式的UML类结构图。

 

同样我们用代码来实现,定义一个Handler抽象类,其中有一个具体方法是设置处理类的后继者,这样才能实现当一个具体的处理类不能处理该请求时将请求转发给它的后继者,还有一个抽象方法是其各个派生类实现自己的处理方法。

 1 package day_9_chain;
 2 
 3 /**
 4  * 抽象处理公共类
 5  * @author 余林丰
 6  *
 7  * 2016年10月10日
 8  */
 9 public abstract class Handler {
10     protected Handler handler;
11     
12     public void setNextHandler(Handler handler){
13         this.handler = handler;
14     }
15     
16     public abstract void request(int request);
17 }

接下来是3个具体的处理类。

 1 package day_9_chain;
 2 
 3 /**
 4  * 具体处理类1
 5  * @author 余林丰
 6  *
 7  * 2016年10月10日
 8  */
 9 public class ConcreteHandler1 extends Handler {
10 
11     /* (non-Javadoc)
12      * @see day_9_chain.Handler#request(int)
13      */
14     @Override
15     public void request(int request) {
16         if (request >=0 && request <= 10){
17             System.out.println("ConcreteHandler1处理请求:" + request);
18         } else if (handler != null){
19             handler.request(request);
20         }
21     }
22 
23 }
 1 package day_9_chain;
 2 
 3 /**
 4  * 具体处理类2
 5  * @author 余林丰
 6  *
 7  * 2016年10月10日
 8  */
 9 public class ConcreteHandler2 extends Handler {
10 
11     /* (non-Javadoc)
12      * @see day_9_chain.Handler#request(int)
13      */
14     @Override
15     public void request(int request) {
16         if (request > 10 && request <= 20){
17             System.out.println("ConcreteHandler2处理:" + request);
18         } else if (handler != null){
19             handler.request(request);
20         }
21     }
22 
23 }
 1 package day_9_chain;
 2 
 3 /**
 4  * 具体处理类3
 5  * @author 余林丰
 6  *
 7  * 2016年10月10日
 8  */
 9 public class ConcreteHandler3 extends Handler {
10 
11     /* (non-Javadoc)
12      * @see day_9_chain.Handler#request(int)
13      */
14     @Override
15     public void request(int request) {
16         if (request > 20 && request <= 30){
17             System.out.println("ConcreteHandler3处理:" + request);
18         } else if (handler != null){
19             handler.request(request);
20         }
21     }
22 
23 }

客户端测试代码。

 1 package day_9_chain;
 2 
 3 /**
 4  * @author 余林丰
 5  *
 6  * 2016年10月10日
 7  */
 8 public class Client {
 9 
10 
11     public static void main(String[] args) {
12         ConcreteHandler1 concreteHandler1 = new ConcreteHandler1();
13         ConcreteHandler2 concreteHandler2 = new ConcreteHandler2();
14         ConcreteHandler3 concreteHandler3 = new ConcreteHandler3();
15         
16         concreteHandler1.setNextHandler(concreteHandler2);
17         concreteHandler2.setNextHandler(concreteHandler3);
18         
19         concreteHandler1.request(25);
20         
21     }
22 
23 }

我们可以看到职责链的好处在于:当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。它们仅需保持一个指向其后继者的引用,而且并不需要保持它后面所有后继者的引用。和这个职责链模式类似的还有一个东西叫做“链处理”,需要导入一个叫做commons-chain的jar包,这个也很实用,它用来描述一个顺序处理的过程,有兴趣可以看一看。

设计模式(十八)——职责链模式

设计模式(十八)——职责链模式一、职责链模式简介1、职责链模式简介职责链模式(ChainOfResponsibility)使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。将可能处理请求的对象连成一条链,并沿着... 查看详情

javascript设计模式——职责链模式

前面的话  职责链模式的定义是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。职责链模式的名字非常形象,... 查看详情

设计模式之职责链

职责链(ChainofResponsibility)模式属于23种设计模式之一,职责链也称为责任链,《Designpattern:thebasisofreusableobject-orientedsoftware》(以下简称DP)一书中是这样描述职责链的:职责链模式使多个对象都有机会处理请求,从而避免请求... 查看详情

设计模式职责链模式

...色三、结构图四、代码实现五、小结1、优点2、缺点六、职责链模式分类1、纯的职责链模式2、不纯的职责链模式。一、概念使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条... 查看详情

职责链模式

职责链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。我们先来看一下职责链模式的结构图:首先... 查看详情

设计模式值职责链模式(行为型)(代码片段)

目录一、行为型模式二、职责链模式定义三、职责链模式角色四、简单实例五、模式应用一、行为型模式介绍职责链模式之前先介绍一下行为型设计模式,因为按照GoF模式分类,职责链就是一种行为型设计模式。行为型设计模式... 查看详情

设计模式之职责链模式

(一)  职责链模式的介绍   职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.   (二)职责... 查看详情

职责链模式-chainofresponsibility

职责链模式(ChainofResponsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。职责链模式结构图:代码实现Handler... 查看详情

职责链模式

职责链模式(ChainofResponsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。职责链的好处:客户提交一个... 查看详情

小看--职责链模式

   职责链模式,是属于行为型设计模式,可以把一个请求分给多个对象处理的机会,可以避免发送者和处理者之间的耦合。  (二)职责链模式的演变   现在员工需要请假,请假审批规则如下: ... 查看详情

设计模式解密(20)-职责链模式

...着这条链传递请求,直到有对象处理它为止。主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。本... 查看详情

设计模式之职责链模式

职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。将这些对象连成一条链,沿着这条链传递该请求,直到有一个对象处理为止。 publicabstractclassHandler{protectedHandlerhandler;publicvoidsetHandler(... 查看详情

职责链模式

...着这条链传递请求,直到有对象处理它为止。主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。本... 查看详情

设计模式——职责链模式(代码片段)

模式介绍职责链模式(ChainOfResponsibilityPattern),又叫责任链模式,为请求创建了一个接收者对象的链(简单示意图)。这种模式对请求的发送者和接收者进行解耦。职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个... 查看详情

大话设计模式-职责链模式(代码片段)

职责链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。职责链模式的好处当客户提交一个请求时,请求时艳... 查看详情

职责链模式

...System;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;/*职责链模式***好处是把任务分化了,并让各个执行只管处理自己的部分,处理不能转交下一个处理进行处理*不好是可能到最后就没有处理到请求**/namespaceApp_MYCS.HDL_SJMS.ZRLMS... 查看详情

设计模式之职责链模式

设计模式之职责链模式May16,2015职责链模式(Chainofresponsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止... 查看详情

javascript---设计模式之职责链模式

概念职责链模式是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。链中收到请求的对象要么亲自处理它,要么转... 查看详情