zoukankan      html  css  js  c++  java
  • 设计模式之责任链模式

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

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

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

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

      结构图

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

      现在,我们公司有一个自评规则:当自评分数小于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.  可以动态地指定一组请求处理类,并且可以动态的管理这些类。

      

  • 相关阅读:
    Leetcode 92. Reverse Linked List II
    Leetcode 206. Reverse Linked List
    Leetcode 763. Partition Labels
    Leetcode 746. Min Cost Climbing Stairs
    Leetcode 759. Employee Free Time
    Leetcode 763. Partition Labels
    搭建数据仓库第09篇:物理建模
    Python进阶篇:Socket多线程
    Python进阶篇:文件系统的操作
    搭建数据仓库第08篇:逻辑建模–5–维度建模核心之一致性维度2
  • 原文地址:https://www.cnblogs.com/chenxkang/p/6774332.html
Copyright © 2011-2022 走看看