设计模式:责任链模式(Chain of Responsibility)

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

责任链模式的角色:
1. 抽象处理者角色(Handler):定义出一个处理请求的接口。如果需要,接口可以定义出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handlerRequest()规范了子类处理请求的操作。
2. 具体处理者角色(ConcreteHandler):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。

 举个简单例子:报销流程,项目经理<部门经理<总经理
 其中项目经理报销额度不能超过1000,部门经理报销额度不能超过5000,超过5000的则需要总经理审核。
1 抽象处理角色ConsumeHandler

public abstract class ConsumeHandler
{
    private ConsumeHandler nextHandler;

    public ConsumeHandler getNextHandler()
    {
        return nextHandler;
    }

    public void setNextHandler(ConsumeHandler nextHandler)
    {
        this.nextHandler = nextHandler;
    }

    public abstract void doHandler(String user, BigDecimal free);
}

2 具体处理角色

public class ProjectHandler extends ConsumeHandler
{
    @Override
    public void doHandler(String user, BigDecimal free)
    {
        if(free.doubleValue() < 1000)
        {
            if(user.equals("jj"))
                System.out.println(user+"报销不通过");
            else
                System.out.println(user+"给予报销:"+free);
        }
        else
        {
            if(getNextHandler() != null)
            {
                getNextHandler().doHandler(user, free);
            }
        }
    }
}

public class DeptHandler extends ConsumeHandler
{
    @Override
    public void doHandler(String user, BigDecimal free)
    {
        if(free.doubleValue() < 5000)
        {
            if(user.equals("qq"))
                System.out.println(user+"报销不通过");
            else
                System.out.println(user+"给予报销:"+free);
        }
        else
        {
            if(getNextHandler() != null)
            {
                getNextHandler().doHandler(user, free);
            }
        }
    }
}

public class GeneralHandler extends ConsumeHandler
{
    @Override
    public void doHandler(String user, BigDecimal free)
    {
        if(free.doubleValue() >= 5000)
        {
            if(user.equals("zzh"))
                System.out.println(user+"报销不通过");
            else
                System.out.println(user+"给予报销:"+free);
        }
        else
        {
            if(getNextHandler() != null)
            {
                getNextHandler().doHandler(user, free);
            }
        }
    }
}

3 测试代码

        ConsumeHandler project = new ProjectHandler();
        ConsumeHandler dept = new DeptHandler();
        ConsumeHandler general = new GeneralHandler();
        project.setNextHandler(dept);
        dept.setNextHandler(general);
        project.doHandler("jj", new BigDecimal(2000));
        project.doHandler("jj", new BigDecimal(300));
        project.doHandler("qq", new BigDecimal(2000));
        project.doHandler("zzh", new BigDecimal(20000));
        project.doHandler("qq", new BigDecimal(20000));

测试结果:

jj给予报销:2000
jj报销不通过
qq报销不通过
zzh报销不通过
qq给予报销:20000

 和这个例子相同的还有请假管理,比如请假2天内的部门经理可以处理,超过2天不超过5天的可以研发总监处理,超过5天的需要总经理处理。
 责任链模式可能是一条直线,一个环链甚至一个树结构的一部分。
 责任链模式的缺点:当责任链的链结构比较长比较复杂的话,会产生很多内存垃圾对象,他们在实际处理中,并没有发挥任何的作用。

JDK中的责任链模式
java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()



参考资料
1. 《23种设计模式
2. 《细数JDK里的设计模式
3. 《重温设计模式(三)——职责链模式(chain of responsibility)

时间: 2024-08-06 21:23:47

设计模式:责任链模式(Chain of Responsibility)的相关文章

乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) 作者:webabcd 介绍 为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它. 示例 有一个Message实体类,某个类对它的操作有Insert()方法.现在要求根据插

设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)

 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述        你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与官员之间耦合在一起,让多个(部门)对象都有可能接收请求,将这些(部门)对象连接成一条链,并且沿着这条链传递请求,直到有(部门)对象处理它为止. 例子1:js的事件浮升机制 例子2: 2.问题

Java设计模式--责任链模式

责任链模式 使多个对象都有机会都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. Chain of Responsibility Pattern A void coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiv

13、Python与设计模式--责任链模式

一.请假系统 假设有这么一个请假系统:员工若想要请3天以内(包括3天的假),只需要直属经理批准就可以了:如果想请3-7天,不仅需要直属经理批准,部门经理需要最终批准:如果请假大于7天,不光要前两个经理批准,也需要总经理最终批准.类似的系统相信大家都遇到过,那么该如何实现呢?首先想到的当然是if-else-,但一旦遇到需求变动,其臃肿的代码和复杂的耦合缺点都显现出来.简单分析下需求,"假条"在三个经理间是单向传递关系,像一条链条一样,因而,我们可以用一条"链"把他们进

设计模式之禅之设计模式-责任链模式

一:责任链模式的定义        --->使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止.        --->责任链模式的重点是在"链"上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果        --->一般会有一个封装类对责任模式进行封装,也就是替代Client类,直接返回链中的第一个处理者,具体链的设置不需要高层次模块关系,这样,更简化了

重温设计模式(三)——职责链模式(chain of responsibility)

一.写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所以希望各位多多指教. 二.什么是链 文章伊始,先让我们了解这个最基本的概念,什么是链. 我给链下了这样的定义: 1.链是一系列节点的集合. 2.链的各节点可灵活拆分再重组. 三.何为职责链 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着

职责链模式(chain of responsibility)

原文地址 一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所以希望各位多多指教. 二. 什么是链 文章伊始,先让我们了解这个最基本的概念,什么是链. 我给链下了这样的定义: 链是一系列节点的集合. 链的各节点可灵活拆分再重组. 三. 何为职责链 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链

责任链模式

package pattern.chainofresponsibility; /** * 责任链模式:Chain of Responsibility * @version 2009-5-9 * @author Winty(wintys@gmail.com) */ public class ChainOfResponsibilityTest{ public static void main(String[] args){ Handler handler1 = new ConcreteHandler

跟屌丝学设计模式之责任链模式

JAVA之责任链模式 原文地址:http://itzyx.com/index.php/java_zrl/ 在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的:  责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和