指责链模式

  GOF:职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

  类图:

        PS.Successor是继承者的意思,如果当前的Handler不能处理请求时,就将请求传给Successor。

  适用性:

  • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
  • 你想在不明确指定接受者的情况下,向多个对象中的一个提交一个请求。
  • 可处理一个请求的对象集合应被动态指定。

  优缺点:

  • 降低耦合性。客户无需知道请求具体是被哪个对象处理了,只需要知道把请求发给谁即可。
  • 增强了给对象指派职责的灵活性。我们可以在处理请求的类中修改successor即可修改职责链。
  • 不保证被接受。我们只是把请求放到职责链中,具体该链如何处理该请求是由链自己决定的。


  

  模板代码(参考《大话设计模式》):

public class 职责链模式 {
    public static void main(String[] args) {
        Handler h1 = new ConcreteHandler1();
        Handler h2 = new ConcreteHandler2();
        Handler h3 = new ConcreteHandler3();
        h1.SetSuccessor(h2);
        h2.SetSuccessor(h3);

        int[] request = {5, 15, 25, 35};

        for(int i : request)
            h1.HandleRequest(i);
    }
}
class Handler {
    protected Handler successor;

    public void SetSuccessor(Handler successor) {
        this.successor = successor;
    }

    public void HandleRequest(int request) {}
}

class ConcreteHandler1 extends Handler {
    public void HandleRequest(int request) {
        if(request >= 0 && request < 10) {
            System.out.println("ConcreteHandler1 handle request " + request);
        }
        else {
            if (successor != null) {
                successor.HandleRequest(request);
            } else {
                System.out.println("Request " + request + " is unhandled");
            }
        }
    }
}

class ConcreteHandler2 extends Handler {
    public void HandleRequest(int request) {
        if(request >= 10 && request < 20) {
            System.out.println("ConcreteHandler2 handle request " + request);
        }
        else {
            if (successor != null) {
                successor.HandleRequest(request);
            } else {
                System.out.println("Request " + request + " is unhandled");
            }
        }
    }
}

class ConcreteHandler3 extends Handler {
    public void HandleRequest(int request) {
        if(request >= 20 && request < 30) {
            System.out.println("ConcreteHandler3 handle request " + request);
        }
        else {
            if (successor != null) {
                successor.HandleRequest(request);
            } else {
                System.out.println("Request " + request + " is unhandled");
            }
        }
    }
}

  例子:向老师请假时,如果请假日太多,需要上交给年级主任,如果请更多,需要上交给学校。

  

  小结:职责链可以将原本需要长长的if-else if或switch-case语句分解,原本会根据请求的类型来进行相关处理,现在将相关处理都封装成类,我们只需要将请求发给最低级的处理类(嘛,也不一定要从最低级的开始),该处理类会判断该请求自己能否处理,如果不能则交给下一级。其实有点像异常的处理。

时间: 2024-10-29 19:06:57

指责链模式的相关文章

设计模式19:Chain Of Responsibility 职责链模式(行为型模式)

Chain Of Responsibility 职责链模式(行为型模式) 请求的发送者与接受者 某些对象请求的接受者可能有多种多样,变化无常…… 动机(Motivation) 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合. 如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦. 意图(Intent) 使多个对象都有机会处理请求,从而避免请求的发送者和接受者

Chain of Responsibility - 职责链模式

定义 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合度. 案例 比如现在有一个图形界面,它包括一个应用Application类,一个主窗口Window,一个按钮Button,Window和Button都是继承自Widget类,现在在Button上按滑动鼠标滚轮,Button类不一定要处理,可能是Window类处理,也可能是是Application类处理,每一个类只处理自己关心的,从一个链式结构,以此查看是否要处理: 每一个对象都有处理事件的权利,当不处理的时候就会交给父对象处

职责链模式(Chain of Responsibility)的Java实现

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用场景: 1.有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定: 2.在不明确指定接收者的情况下,向多个对象中的一个提交一个请求: 3.处理一个请求的对象集合应被动态指定. 在大学里面当班干部,时常要向上级申请各方面的东西.譬如申请全班外出秋游,普通同学将申请表交给班长,班

设计模式之责任链模式--- Pattern chain-of-responsibility

模式的定义 责任链模式定义如下: Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it. 使多个对象都有机会处理请求,从而避免请求的发送

大量逻辑判断优化的思路——责任链模式复习总结及其和状态模式对比

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下: 责任链模式概念和例子 使用的条件 和状态模式的比较分析 责任链的优缺点 纯的责任链和不纯的责任链 javax.servlet.Filter#doFilter()方法源码分析 基于AOP思想,模拟一个拦截器 前面说了一个状态模式,总结过程中发现和这个责任链的使用场景很类似,都是为了解耦大量复杂业务逻辑判断的,那么他们有什么不同呢?回忆状态模式——状态模式允许通过改变对象的内部状态而改变对象自身的行为,这个对象

JAVA设计模式(13):行为型-责任链模式(Responsibility)

定义 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求, 如果能则处理,如果不能则传递给链上的一个对象. 场景: 打牌时,轮流出牌 接力赛跑 大学中,奖学金审批 公司中,公文审批 开发中常见的场景: Java中,异常机制就是一种责任链模式.一个try可以对应多个catch,当第一个catch不匹配类型,则自动跳到第二个catch. Javascript语言中,事件的冒泡和捕获机制.Java语言中,事件的处理采用观察者模式. Servlet开发中

设计模式_责任链模式

定义 Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象都有机会处理请求.从而避免了请求的发送者和接受者之间的耦合关系.

5 行为型模式之- 责任链模式

责任链模式介绍: 责任链模式是行为模式之一,什么是"链"?我们将多个节点首尾相连,就形成了链,对于链式结构,每个节点都可以拆开再重新连接,因此链式结构也具有很好的灵活性.将这样一种结构应用于编程领域,将每一个节点看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从一个链的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止,我们将这样的一种模式称为责任链模式. 责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系,将这

职责链模式(Chain of Responsibility)

一.责任链模式介绍 责任链模式:将能够处理同一类请求的对象连成一条链,使这些对象都有机会处理请求,所提交的请求沿着链传递.从而避免请求的 发送者和接受者之间的耦合关系.链上的对象逐个判断是否有能力处理该请求,如果能则就处理,如果不能,则传给链上的下一个对象. 直到有一个对象处理它为止. 场景: 1.打牌时,轮流出牌 2.接力赛跑 3.请假审批 4.公文审批 责任链UML图: Handler:表示处理请求的接口,在这个接口里可以定义链上的下一个继承者,和一个处理请求的抽象方法. ConcreteH