温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何理解责任链模式

发布时间:2021-06-15 15:53:34 来源:亿速云 阅读:177 作者:chen 栏目:web开发

本篇内容主要讲解“如何理解责任链模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解责任链模式”吧!

什么是责任链模式呢

责任链模式英文解释为:

Avoid coupling the sender of a request to its receiver bygiving more than one  object a chance to handle the request.Chainthe receiving objects and pass the  request along the chain until anobject handles it.

责任链模式(Chain of Responsibility  Pattern)将链中每一个节点都看作一个对象,每个节点处理的请求均不同,且内部自动维护下一个节点对象。当一个请求从链式的首端发出时,会沿着责任链预设的路径依次传递到每一个节点对象,直至被链中的某个对象处理为止,属于行为型设计模式。

责任链模式通用代码

Java实现责任链设计模式如下:

public abstract class Handler {         protected Handler nextHandler = null;         public abstract void handle();         public Handler getNextHandler() {             return nextHandler;         }         public void setNextHandler(Handler nextHandler) {             this.nextHandler = nextHandler;         } }  public class HandlerA extends Handler{         @Override         public void handle() {             if(nextHandler == null){                 System.out.println("HandlerA handle ...");             }else{                 nextHandler.handle();             }         } }  public class HandlerB extends Handler{         @Override         public void handle() {             if(nextHandler == null){                 System.out.println("HandlerB handle ...");             }else{                 nextHandler.handle();             }         } }  public class HandlerC extends Handler{     @Override     public void handle() {         if(getNextHandler() == null){             System.out.println("HandlerC handle ...");         }else{             getNextHandler().handle();         }     } } //测试 public class  Client{     public static void main(String[] args) {         Handler handlerA = new HandlerA();         Handler handlerB = new HandlerB();         handlerA.setNextHandler(handlerB);         handlerA.handle();     } }

运行结果:

HandlerC handle ...

从上面代码,我们可以画出UML图:

如何理解责任链模式

从UML图中,我们又可以看出,责任链模式中有两个非常重要的角色:

(1)、抽象处理者角色(Handler)

定义处理请求的接口。接口可以也可以给出一个方法以设定和返回对下个对象引用。这个角色通常由一个Java抽象类或者Java接口实现。

(2)、具体处理者角色(HandlerA、HandlerB、HandlerC)

具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下个对象。由于具体处理者持有对下家的引用。

责任链模式的优缺点

  • 优点:请求和处理分开,两者解耦,提供系统的灵活性。

  • 缺点:性能能问,一个链非常长的时候,非常耗时。因为我们避免建立很长的链。

生活中的案例

在日常生活中,责任链模式是比较常见的。我们平时处理工作中的一些事务,往往是各部门协同合作来完成某一个任务的。而每个部门都有各自的职责,因此,很多时候事情完成一半,便会转交到下一个部门,直到所有部门都审批通过,事情才能完成。

责任链模式主要解耦了请求与处理,客户只需将请求发送到链上即可,不需要关心请求的具体内容和处理细节,请求会自动进行传递,直至有节点对象进行处理。

责任链模式主要适用于以下应用场景:

  • 多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。

  • 在不明确指定接收者的情况下,向多个对象中的一个提交请求。

  • 可动态指定一组对象处理请求。

请假流程的代码实现

下面我们来对,前面的案例:OA上请假流程做一个Java代码的实现。

抽象处理者:领导类

public abstract class Leader {     private Leader next;     public void setNext(Leader next) {         this.next = next;     }     public Leader getNext() {         return next;     }     //处理请求的方法     public abstract void handleRequest(double LeaveDays); }

项目负责人

public class ProjectLeader extends Leader {     @Override     public void handleRequest(double LeaveDays) {         if (LeaveDays <= 0.5) {             System.out.println("项目负责人批准您请假" + LeaveDays + "天。");         } else {             if (getNext() != null) {                 getNext().handleRequest(LeaveDays);             } else {                 System.out.println("请假天数太多,没有人批准该假条!");             }         }     } }

技术总监

public class TechnicalDirectorLeader extends Leader {      @Override     public void handleRequest(double LeaveDays) {         if (LeaveDays <= 1) {             System.out.println("技术总监批准您请假" + LeaveDays + "天。");         } else {             if (getNext() != null) {                 getNext().handleRequest(LeaveDays);             } else {                 System.out.println("请假天数太多,没有人批准该假条!");             }         }     } }

Boss

public class BossLeader extends Leader {     @Override     public void handleRequest(double LeaveDays) {         if (LeaveDays >= 2 && LeaveDays <= 30) {             System.out.println("Boss批准您请假" + LeaveDays + "天。");         } else {             if (getNext() != null) {                 getNext().handleRequest(LeaveDays);             } else {                 System.out.println("请假天数太多,没有人批准该假条!");             }         }     } }

发起审批

public class LeaveApproval {     public static void main(String[] args) {         //组装责任链         Leader projectLeader = new ProjectLeader();         Leader technicalDirectorLeader = new TechnicalDirectorLeader();         Leader bossLeader = new BossLeader();          projectLeader.setNext(technicalDirectorLeader);         technicalDirectorLeader.setNext(bossLeader);          //请假两天,提交请假流程,开启审批环节,         projectLeader.handleRequest(2);     } }

审批结果

Boss批准您请假2.0天。

如果请假天数是31天,审批结果

请假天数太多,没有人批准该假条!

整个请假流程为:

如何理解责任链模式

把这张流程图改成纵向:

如何理解责任链模式

就这么一环套一环的,使用上面两个例子和两张图来理解责任链模式是不是就更轻松了?

自己吹牛逼,没什么用,下面来看看大神们是怎么使用责任链模式的。

大佬们是如何使用的

在Spring、Mybatis等框架中,都用使用到责任链模式,下面先来看在Spring中是如何使用的。

在Spring MVC中的org.springframework.web.servlet.DispatcherServlet类中:

如何理解责任链模式

getHandler 方法的处理使用到了责任链模式,handlerMappings是之前 Spring 容器初始化好的,通过遍历  handlerMappings查找与request匹配的 Handler, 这里返回 HandlerExecutionChain 对象。这个  HandlerExecutionChain对象到后面执行的时候再分析为什么返回的是这样一个对象。

@Nullable protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {  if (this.handlerMappings != null) {   for (HandlerMapping mapping : this.handlerMappings) {    HandlerExecutionChain handler = mapping.getHandler(request);    if (handler != null) {     return handler;    }   }  }  return null; }

到此,相信大家对“如何理解责任链模式”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI