`
frank-liu
  • 浏览: 1666351 次
  • 性别: 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
分享到:
评论

相关推荐

    JAVA设计模式之行为模式

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

    北京中科信软 面向对象设计模式培训

    1. 面向对象综述 ...18. Strategy、State、Template Method、Command、Chain of Responsibility、Observer、Mediator 19. ,Interpreter、Iterator、Memento、Visitor、Collecting Parameter 20. 总结

    研磨设计模式(完整带书签).part2.pdf

    本电子书一共两个压缩文档,本文件为part2. ...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第12章 职责链(chain of responsibility)模式 115 第13章 享元(flyweight)模式 122 第14章 构造型模式介绍 130 第15章 构建者(builder)模式 134 第16章 工厂方法(factory method)模式 141 第17章 抽象工厂(abstract ...

    研磨设计模式(完整带书签).part1.pdf

    本电子书一共两个压缩文档,该文档为part1。...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    ASP.NET设计模式-杨明军译(源码)

    8.3.2 Chain of Responsibility模式 8.4 Model-View-Controller 8.4.1 ViewModel模式 8.4.2 ASP.NET MVC框架 8.4.3 利用AutoMapper映射ViewModel 8.4.4 Castle MonoRail 8.5 Page Controller模式 8.6 小结 ...

    研磨设计模式-part2

    完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式-part4

    完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式-part3

    完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式.part3(共4个)

    完整清晰版,完美书签. 《研磨设计模式》完整...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式.part2(共4个)

    完整清晰版,完美书签. 《研磨设计模式》完整...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式.part4(共4个)

    完整清晰版,完美书签. 《研磨设计模式》完整...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式.part1(共4个)

    完整清晰版,完美书签. 《研磨设计模式》完整...第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    深入理解JavaScript系列(38):设计模式之职责链模式详解

    主要介绍了深入理解JavaScript系列(38):设计模式之职责链模式详解,职责链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,需要的朋友可以参考下

    java 设计模式资料

    Chain of Responsibility:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。 Command:将一个请求封装为一个对象...

    百度地图开发java源码-DesignPatterns:要深刻理解开源代码,必先掌握丰富的设计模式

    责任链模式(Chain of Responsibility) 3.2 命令模式(Command) 3.3 解释器模式(Interpreter) 3.4 迭代器模式(Iterator) 3.5 中介者模式(Mediator) 3.6 备忘录模式(Memento) 3.7 观察者模式(Observer) ...

    二十三种设计模式【PDF版】

    设计模式之 Chain of Responsibility(责任链) 各司其职的类串成一串,好象击鼓传花,当然如果自己能完成,就不要推委给下一个. 设计模式之 Mediator(中介) Mediator 很象十字路口的红绿灯,每个车辆只需和红绿灯交互...

    Design-patterns:java23种设计模式,深入理解灵活运用设计模式对于优化代码质量,提高编程能力非常必要!

    Design-patterns java23种设计模式,深入理解灵活运用设计模式对于优化代码质量,提高编程能力非常必要! Blog 设计模式 module blog 单例模式 Singleton pattern ...Chain of responsibility model

    asp.net知识库

    NET委托:一个C#睡前故事 [推荐] - [原创] Microsoft .NET策略及框架概述 卸载Class? Web Form 窗体 如何实现web页面的提示保存功能 在ASP.Net中两种利用CSS实现多界面的方法 如何在客户端调用服务端代码 页面一...

Global site tag (gtag.js) - Google Analytics