职责链模式

        很多情况下,在一个软件系统中可以处理某个请求的对象不止一个,他们可以构成一条链式结构,这条链就称为职责链。职责链可以是一条直线(最常见)、一个环或者一个树形结构,链上的每一个对象都是请求处理者。

        职责链模式可以将请求的处理者组织成一条链,并让请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,实现请求发送者和请求处理者解耦,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。

职责链模式(Chain of Responsibility  Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。


abstract class Handler {

    //维持对下家的引用

    protected Handler successor;

    public void setSuccessor(Handler successor) {

        this.successor=successor;

    }

    public abstract void handleRequest(String request);

}

备注:从数据结构的角度,责任链模式就是链表。

具体处理者是抽象处理者的子类,它具有两大作用:第一是处理请求,第二是转发请求。

class ConcreteHandler extends Handler {

        public void handleRequest(String request) {

                if (请求满足条件) {

                    //处理请求

                 }

                   else {

                        this.successor.handleRequest(request);  //转发请求

                    }

            }

}

职责链模式并不创建职责链,创建工作必须由系统的其他部分来完成,一般是在使用该职责链的客户端中创建职责链。


纯的职责链模式

      一个纯的职责链模式要求一个具体处理者对象只能在两个行为中选择一个:要么承担全部责任,要么将责任推给下家,不允许出现某一个具体处理者对象在承担了一部分或全部责任后又将责任向下传递的情况。而且在纯的职责链模式中,要求一个请求必须被某一个处理者对象所接收,不能出现某个请求未被任何一个处理者对象处理的情况。

不纯的职责链模式

在一个不纯的职责链模式中允许某个请求被一个具体处理者部分处理后再向下传递,或者一个具体处理者处理完某请求后其后继处理者可以继续处理该请求,而且一个请求可以最终不被任何处理者对象所接收。


职责链模式的主要优点如下:

      (1) 职责链模式使得一个对象无须知道是其他哪一个对象处理其请求,对象仅需知道该请求会被处理即可,接收者和发送者都没有对方的明确信息,且链中的对象不需要知道链的结构,由客户端负责链的创建,降低了系统的耦合度。

      (2) 请求处理对象仅需维持一个指向其后继者的引用,而不需要维持它对所有的候选处理者的引用,可简化对象的相互连接。

      (3) 在给对象分派职责时,职责链可以给我们更多的灵活性,可以通过在运行时对该链进行动态的增加或修改来增加或改变处理一个请求的职责。

      (4) 在系统中增加一个新的具体请求处理者时无须修改原有系统的代码,只需要在客户端重新建链即可,从这一点来看是符合“开闭原则”的。


————————————————

版权声明:本文为CSDN博主「LoveLion」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/lovelion/article/details/7420893

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容