`
frank-liu
  • 浏览: 1681094 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

chain of responsibility模式一:理解

 
阅读更多

引子

        假定我们设想某一个场景,在一个工厂里我们需要经过一系列的工序要生产加工产品。这些生产工序在工厂中我们一般称之为流水线。这些流水线有一个比较有意思的特性,就是每一个步骤是针对生产过程中某一个方面起作用,比如对产品的锻造、抛光,包装等。同时他们所进行的所有行为都是围绕着同一个产品,有严格的顺序要求。做完某一步之后就接着到下一步。

模式的基本概念

        前面的工厂流水线可以作为chain of responsibility模式的一个类比。和流水线类似,在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。

        该模式的结构图如下:

        从图中我们可以看到,我们定义的抽象基类Handler包含有一个指向自身类型的引用。而具体的实现ConcreteHandler1, ConcreteHandler2等可以针对不同的方面做具体的处理实现,这些实现类在处理完该方面之后再将请求转发给下一个。由于successor的引用,我们可以构成一个链表类型的结构,将所有的具体实现类给串起来。

 

一个参考实现

        在实际的实现和应用中,可能会有几种选项我们可以考虑。一个是可以将请求传递整个责任链条,在每个处理节点handler上面选择自己能否处理,否则就传递给下一个。这相当于实际上只有一个handler真正处理了,其他的都是传递的。碰到真正处理的就已经返回了。另外,也可以若干个handler每个都处理一部分,然后直到某个节点处理完毕返回。这些情况都可以。假定我们选择地一种情况。

        对应的代码分别如下:

        Handler: 一方面定义了一个链表结构的基础,同时也作为一个抽象的基类给具体子类来实现。

 

public abstract class Handler
{
    // Fields
    protected Handler successor;
 
    // Methods
    public void setSuccessor( Handler successor )
    {
        this.successor = successor;
    }
    public abstract void handleRequest( int request );
}

 

     ConcreteHandler1, ConcreHandler2分别作为两个具体的Handler子类实现:

 

// "ConcreteHandler1"
public class ConcreteHandler1 extends Handler
{
  // Methods
  override public void handleRequest( int request )
  {
      // if match the handle condition...
    else
        if( successor != null )
            successor.HandleRequest( request );
  }
}

// "ConcreteHandler2"
public class ConcreteHandler2 extends Handler
{
  // Methods
  override public void handleRequest( int request )
  {
       // if match the handle condition...
    else
      if( successor != null )
      successor.handleRequest( request );
  }
}

 在具体调用整个责任链的时候,我们可以使用如下的代码:

 

 // Setup Chain of Responsibility
    Handler h1 = new ConcreteHandler1();
    Handler h2 = new ConcreteHandler2();
    h1.setHandler(h2);
    h1.handleRequest(3);

         我们可以看到,在代码中,我们手工构建一个链表,然后调用handleRequest方法。从表面上看就是h1执行了handleRequest方法,实际上根据需要可能会有h1将请求传递到后面的h2。这就是传递中最核心的部分。

和其他模式的对比

和observer pattern的比较

        如果我们和observer pattern的思路进行比较,会发现他们在一定程度上有很大的相似性。下图是observer pattern的类结构图。

        经过比较,我们会发现。chain of responsibility模式里面所有的handler都有一个指向后面的引用,形成了一个链表的样式。通过一个接一个的传递来处理请求。而observer pattern里所有注册的观察者也可以通过一个list,也可以是链表的方式来得到通知。在observer pattern相当于将process这个处理的方法抽象成一个独立的接口,而且一般将所有注册链的过程封装在抽象基类里。而在chain of responsibility里会手工来构造这个处理链。这里像一个工厂的流水线,强调流程以及顺序。每一个handler相当于其中的某一道加工工序,这样就不能允许出现顺序错乱。所以该模式比较强调一个比较灵活的强调顺序的过程。

        另外一方面,chain of responsibility允许所有的handler都有机会来处理请求,但不一定要所有的handler都来处理,在具体的handler可能只是起到一个转发的作用。而observer patter中所有的观察者都相当于一个关注者,他们当事件触发的时候相当于所有人都有动作,而不是有的有而有的没有。不存在前面一个传递到后面一个的概念。而observer pattern强调一个对事件通知的分离,并不强调观察者行动的顺序性。只要所有注册的观察者被通知到就可以了,至于谁先被通知,谁后被通知都无所谓。

 

 

和template method的比较

       template method模式和它也有很多相似的地方。下面是template method模式的结构图。

        template method模式也强调一个过程,一般会是在抽象基类里定义好了一个过程需要的步骤。每个步骤对应一个方法,具体方法的实现依赖于实现的子类。和chain of responsibility模式比起来,这个模式里定义的过程是固定的,如果需要调整的话就要调整基类里的方法。而在chain of responsibility模式中handler是可以根据需要组合的,相对来说更加有灵活性。

 

总结

        chain of responsibility模式本身比较简单,就相当于抽象出一个处理的接口然后用构造链表的方式来把各具体的处理步骤串联起来。在实际应用中可能包括有单个处理并返回或者多个处理返回的情况。一些典型的应用包括MINA里面Filter chain实现,就用到了该模式并采用了第二种方式。而另外一个在Apache commons chain的开源实现中,它采用了第一种方式。这些具体实现会在后面一篇文章中详细分析。

参考资料:

1. A look at commons chain

2. design patterns

3. MINA

  • 大小: 17.7 KB
  • 大小: 22 KB
分享到:
评论

相关推荐

    设计模式C++学习之责任链模式(Chain of Responsibility)

    责任链模式(Chain of Responsibility)是一种行为设计模式,它允许将请求沿着处理者对象的链进行传递,直到某个对象能够处理这个请求。这种模式的主要优点是解耦了发送者和接收者之间的关系,使得系统更加灵活,...

    chain of responsibility 职责链模式(行为模式)

    职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求的发送者和接收者解耦,使得多个对象都有可能处理一个请求,而无需显式指定接收者。在这个模式中,请求沿着一个处理者链进行传递,...

    C#面向对象设计模式纵横谈(20):(行为型模式) Chain Of Responsibility 职责链模式

    职责链模式(Chain of Responsibility)是一种行为型设计模式,它允许将请求沿着处理者对象的链进行传递,直到某个对象能够处理这个请求。在C#中,职责链模式的应用可以帮助我们构建灵活、可扩展的系统,减少对象...

    C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式)

    在本篇文章中,我们将深入探讨C#中的Chain of Responsibility(职责链)模式,这是行为型设计模式的一种。虽然标题提到的是“TemplateMethod模板方法”,但从内容来看,实际上探讨的是职责链模式。为了更好地理解这...

    java设计模式之责任链(chain of responsibility)

    责任链(Chain of Responsibility)模式是一种行为设计模式,它允许我们向对象链中传递请求,让每个对象决定是否处理这个请求。在Java中,这种模式常用于事件处理、日志系统或者权限控制等场景,其核心思想是将处理...

    chain-of-responsibility-demo 责任链模式demo

    责任链模式是一种行为设计模式,它允许我们向多个对象中的一个发送请求,而无需知道哪个对象会处理这个请求。...在`chain-of-responsibility-demo`中,你可以通过分析代码结构和逻辑,深入理解这一模式的应用及其优势。

    Chain-of-responsibility:简单的责任链示例

    责任链模式(Chain of Responsibility)是一种行为设计模式,它允许我们向多个对象中的一个发送请求,而无需指定接收者是谁。这种模式的核心思想是将处理请求的对象形成一条链,请求在链上的对象间传递,直到被某个...

    php设计模式 Chain Of Responsibility (职责链模式)

    **PHP设计模式:Chain Of Responsibility(职责链模式)** 职责链模式是一种行为设计模式,它的主要目的是解耦请求的发送者和接收者,通过创建一个处理请求的对象链,使得多个对象都有机会处理这个请求。在PHP中,...

    23种设计模式(C++).pdf

    - Chain of Responsibility模式:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。 - Iterator模式:提供一种方法...

    《设计模式:可复用面向对象软件的基础》英文版

    例如责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式...

    C++设计模式基础教程.pdf

    15. 责任链模式(Chain of Responsibility Pattern):在该模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。 16. 策略模式(Strategy Pattern):定义一个算法家族,将它们一个个封装,并使它们...

    JAVA设计模式(创建模式 结构模式 行为模式)

    2. 责任链模式(Chain of Responsibility Pattern):避免对象之间的耦合,通过将请求沿着处理者链传递,直到有处理者处理该请求。 3. 命令模式(Command Pattern):将命令封装为一个对象,以便使用不同的请求、...

    设计模式可复用面向对象软件的基础 源码

    - 责任链模式(Chain of Responsibility):避免硬编码调用链,将请求沿着处理者链进行传递。 - 命令模式(Command):将请求封装为一个对象,以便使用不同的请求、队列请求或支持可撤销的操作。 - 解释器模式...

    java23种设计模式详解+源码(绝对详解)

    - 责任链模式(Chain of Responsibility):避免将请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求。 - 命令模式(Command):将请求封装为一个对象,以便使用不同的请求、队列请求、或者支持撤销...

    JAVA设计模式之行为模式

    这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...

    设计模式_设计模式_

    - 责任链模式(Chain of Responsibility):将请求沿着处理者链传递,直到有处理者处理请求。 - 命令模式(Command):将命令封装为对象,以便于使用参数化客户端、支持撤销操作以及记录日志等。 - 解释器模式...

    设计模式23种类图

    - 责任链模式(Chain of Responsibility):避免将请求的发送者和接收者耦合在一起,使多个对象都有可能处理请求。 - 命令模式(Command):将请求封装为一个对象,以便使用不同的请求、队列请求或支持可撤销的...

    关于23种设计模式的有趣见解.docx

    15、CHAIN OF RESPONSIBILITY模式:使多个对象都有机会处理请求,直到找到合适的对象为止。 16、COMMAND模式:将请求封装成对象,从而使得可以使用不同的请求队列、日志记录请求、撤销操作等。 17、INTERPRETER模式...

    1.《设计模式:可复用面向对象软件的基础(完整书签)》

    如命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录模式(Memento)、观察者模式(...方法模式(Template Method)和职责链模式(Chain of Responsibility)...

    23种设计模式实例(JAVA实现)

    我们将主要关注以下几个设计模式:Adapter、Chain of Responsibility 和 Singleton,这些都是Java编程中极为重要的设计模式。 1. **适配器模式(Adapter)**: 适配器模式是一种结构型设计模式,它允许不兼容的类之间...

Global site tag (gtag.js) - Google Analytics