责任链模式 - 行为模式

来源:互联网 发布:太原师范学院教务网络 编辑:程序博客网 时间:2024/06/06 17:18
个人理解:    

模式类型:
    Chain of Responsibility  责任链模式 - 行为模式
    
意图:
    It avoids attaching the sender of a request to its receiver, giving this way other objects the possibility of handling the request too.
    The objects become parts of a chain and the request is sent from one object to another across the chain until one of the objects will handle it.
    使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

    
概述:
    1)在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。
    2)请求在这条链上传递,直到链上的某一个对象处理此请求为止。
    3)发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
    
角色:
    抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。
    具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

结构图:



模式的优缺点:
优点:
    降低耦合度 :该模式使得一个对象无需知道是其他哪一个对象处理其请求。对象仅需知道该请求会被“正确”地处理。接收者和发送者都没有对方的明确的信息,且链中的对象不需知道链的结构。
    职责链可简化对象的相互连接 :    结果是,职责链可简化对象的相互连接。它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。
    增强了给对象指派职责(Responsibility)的灵活性 :当在对象中分派职责时,职责链给你更多的灵活性。你可以通过在运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责。你可以将这种机制与静态的特例化处理对象的继承机制结合起来使用。
    增加新的请求处理类很方便
缺点:
    不能保证请求一定被接收。既然一个请求没有明确的接收者,那么就不能保证它一定会被处理 —该请求可能一直到链的末端都得不到处理。一个请求也可能因该链没有被正确配置而得不到处理。
    系统性能将受到一定影响,而且在进行代码调试时不太方便;可能会造成循环调用

模式的应用场景:
    Having so many design patterns to choose from when writing an application, it's hard to decide on which one to use, so here are a few situations when using the Chain of Responsibility is more effective:
    More than one object can handle a command
    The handler is not known in advance
    The handler should be determined automatically
    It's wished that the request is addressed to a group of objects without explicitly specifying its receiver
    The group of objects that may handle the command must be specified in a dynamic way  

    在以下条件下使用Responsibility 链:
    有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
    你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
    可动态指定一组对象处理请求。

补充:
纯的与不纯的责任链模式
    一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,而是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又 把责任向下传的情况。
    在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。
    纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。有些人认为不纯的责任链根本不是责任链模式,这也许是有道理的。但是在实际的系统里,纯的责任链很难找到。如果坚持责任链不纯便不是责任链模式,那么责任链模式便不会有太大意义了。

实际应用
    spring中也有应用。HandlerMapping、AbstractHandlerMapping等,自己有空再做分析吧。
    struts2中的拦截器也是其经典应用之一。
    Tomcat中的Filter就是使用了责任链模式,创建一个Filter除了要在web.xml文件中做相应配置外,还需要实现javax.servlet.Filter接口。

代码(其实读UML图要比代码还要一目了然):
想贴自己分析的代码,有空再做

所有模式:
     创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
    补充模式:空对象模式


参考/转自:
http://blog.csdn.net/hguisu/article/details/7547231
http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 【有讲Tomcat中的应用】
http://www.oodesign.com/chain-of-responsibility-pattern.html


转载请注明:    http://blog.csdn.net/paincupid/article/details/46943547


0 0
原创粉丝点击