责任链模式(chainOfResponsibility)

参考文章:http://wiki.jikexueyuan.com/project/design-pattern-behavior/chain-four.html

定义:

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

分类:

  • 纯的职责链模式

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

  • 不纯的职责链模式

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

uml类图:

模式组成:

  • Handler : 抽象处理者角色,声明一个请求处理的方法,并保持下一个处理节点 Handler 对象的引用.
  • ConcreteHandler : 具体处理者角色,对请求进行处理,如果不能处理,则将请求传递给下一个节点Handler

优点:

  • 责任链模式减低了发出命令的对象和处理命令的对象之间的耦合
  • 发出命令的对象只是把命令传给链结构的起始者,而不需要知道到底是链上的哪一个节点处理了这个命令。
  • 在给对象分派职责时,职责链可以给我们更多的灵活性,可以通过在运行时对该链进行动态的增加或修改来增加或改变处理一个请求的职责。
  • 在系统中增加一个新的具体请求处理者时无须修改原有系统的代码,只需要在客户端重新建链即可,从这一点来看是符合“开闭原则”的。

缺点:

  • 由于一个请求没有明确的接收者,那么就不能保证它一定会被处理,该请求可能一直到链的末端都得不到处理;一个请求也可能因职责链没有被正确配置而得不到处理。
  • 所有责任开始都是从指定的接收者依次传递下去,运行中无法从中间开始传递

应用场景:

  • 有多个对象可以处理同一个请求,具体哪个对象处理该请求待运行时刻再确定,客户端只需将请求提交到链上,而无须关心请求的处理对象是谁以及它是如何处理的。
  • 需要动态指定一组对象处理请求

实际应用:

  • Java的异常机制就是一个责任链模式,一个try可以对应多个cathc。如果某一个catch不匹配,则跳到下一个catch中
  • Servlet开发中,过滤器的链式处理
  • Struts2中,拦截器的处理

举个栗子:

(审批流程)

定义抽象处理角色

interface Handler {
    public boolean handleRequest(Request request);
    public String getName();
}

定义一个请求类

class Request {
    public int getLeaveDays() {
        return 4;
    }
}

定义一个具体处理角色

class Manager implements Handler {

    @Override
    public boolean handleRequest(Request request) {
        if (request.getLeaveDays() > 5) {
            return false;
        }
        return true;
    }

    @Override
    public String getName() {
        return "部门经理";
    }
}

定义一个具体处理角色

class CTO implements Handler {

    @Override
    public boolean handleRequest(Request request) {
        if (request.getLeaveDays() > 3) {
            return false;
        }
        return true;
    }

    @Override
    public String getName() {
        return "技术总监";
    }
}

初始化责任链,并调用

public class ChainOfResponsibilityTest {
    static List<Handler> handlers = new ArrayList<Handler>();
    static{
        handlers.add(new Manager());
        handlers.add(new CTO());
    }
    public static void main(String[] args) {

        for (Handler h : handlers) {
            if (!h.handleRequest(new Request())) {
                System.out.println("该次请假未通过审批,审批人:"+h.getName());
            }
        }
    }
}

输出

时间: 2024-10-13 16:19:10

责任链模式(chainOfResponsibility)的相关文章

学习笔记——责任链模式ChainOfResponsibility

责任链模式,主要是通过自己记录一个后继者来判断当前的处理情况.Handler中,再增加一个方法用于设置后继对象,如SetHandler(Handler obj). 然后Handler类以其子类的处理方法Handler()通过判断后继对象是否存在来操作: 1.没有设置后继对象,自己处理事件 2.有后继对象,交给后继者的Handler()处理. 通过这样的不断调用传递,处理责任将到达最终的对象上. 比如,当我们要处理一个网络请求返回时,一般肯定是写一串函数,然后通过判断来依次执行相应操作,如果采用责

Java设计模式偷跑系列(十八)建模和责任链模式的实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018231 责任链模式(ChainOfResponsibility): 有多个对象,每一个对象持有下一个对象的引用,形成一条链.请求在这条链上传递.直到某一对象决定处理该请求,可是发出者并不清楚终于哪个对象会处理该请求. 一.uml建模: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGh5X3ljdQ==/font/5a6L5L2T/fo

Java设计模式菜鸟系列(十八)责任链模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018231 责任链模式(ChainOfResponsibility): 有多个对象,每个对象持有下一个对象的引用,形成一条链,请求在这条链上传递,直到某一对象决定处理该请求,但是发出者并不清楚最终哪个对象会处理该请求. 一.uml建模: 二.代码实现 /** * 责任链模式:有多个对象,每个对象持有下一个对象的引用,形成一条链, * * 请求在这条链上传递,直到某一对象决定处理该请求,

设计模式之责任链模式--- 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. 使多个对象都有机会处理请求,从而避免请求的发送

chainOfResponsibility责任链模式

责任链(Chain of Responsibility)模式 : 责任链模式是对象的行为模式.使多个对象都有机会处理请求,从而避免请求的发送者和接受者直接的耦合关系.将这些处理对象连成一条链,沿着这条链传递该请求,直到有一个对象处理它为止.责任链模式强调的是每一个对象及其对下家的引用来组成一条链,利用这种方式将发送者和接收者解耦,类图如下: 通过上图可以看出责任链模式有两个角色: 抽象处理者(Handler)角色 :定义一个请求的接口.如果需要可以定义个一个方法用来设定和返回下家对象的引用. 具

设计模式学习-责任链模式

1.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 2.类图 3.代码示例 1 package com.zhaoyangwoo.chainOfResponsibility; 2 3 /** 4 * Created by john on 16/6/16. 5 * 职责链模式,经费审批场景 6 */ 7 public class Responsibility { 8 9 public static void

24种设计模式--责任链模式【Chain ofResponsibility Pattern】

中国古代对妇女制定了“三从四德”的道德规范,“三从”是指“未嫁从父.既嫁从夫.夫死从子”,也就是说一个女性,在没有结婚的时候要听从于父亲,结了婚后听从于丈夫,丈夫死了还要听儿子的,举个例子来说,一个女的要出去逛街,同样这样的一个请求,在她没有出嫁前她必须征得父亲的同意,出嫁之后必须获得丈夫的许可,那丈夫死了怎么办?一般都是男的比女的死的早,还要问问儿子是否允许自己出去逛街,估计你下边马上要问要是没有儿子怎么办?请示小叔子.侄子等等,在父系社会中,妇女只占从属地位,现在想想中国的妇女还是比较悲惨的

设计模式—责任链模式

责任链模式:在请求对象不清楚处理对象是谁的情况下使用该模式. 请求对象把请求提交给处理对象,所有的处理对象依次进行判断,如果是自己的处理范围则进行处理,结束请求向后传递,如果不属于自己的处理范围则向下传递请求直到请求被处理. 注意区分责任链模式和装饰模式的区别:责任链是对请求对象的处理过滤:装饰模式是对被装饰对象的自由功能扩展. 实例说明:员工请假,5天以内组长有权批准,5~10天ceo有权批准,10~20天董事长有权批准. 定义管理者接口:Manager public abstract voi

设计模式(24)-----责任链模式

责任链模式(chain of responsibility) 定义 责任链模式是对象的行为模式.使多个对象都有机会处理请求,从而避免请求的发送者和接受者直接的耦合关系.将这些对象连成一条链,沿着这条链传递该请求,直到有一个对象处理它为止. UML类图 角色 抽象处理者(Handler)角色 :定义一个请求的接口.如果需要可以定义个一个方法用来设定和返回下家对象的引用. 具体处理者(ConcreteHandler)角色 :如果可以处理就处理请求,如果不能处理,就把请求传给下家,让下家处理.也就是说