十、设计模式(15)责任链模式(Chain of Responsibility)

本文介绍了责任链模式,可避免请求发送者和接受者耦合,将对象连成链传递请求。阐述了其抽象处理者和具体处理者角色,以报销流程、请假管理为例说明应用,还指出链结构复杂会产生内存垃圾对象,最后提及JDK中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源文作者:

作者:朱小厮 
来源:优快云 
原文:https://blog.youkuaiyun.com/u013256816/article/details/50975438 



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

一、责任链模式的角色:

  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));

 4.测试结果:

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

和这个例子相同的还有请假管理,比如请假2天内的部门经理可以处理,超过2天不超过5天的可以研发总监处理,超过5天的需要总经理处理。

责任链模式可能是一条直线,一个环链甚至一个树结构的一部分。

责任链模式的缺点:当责任链的链结构比较长比较复杂的话,会产生很多内存垃圾对象,他们在实际处理中,并没有发挥任何的作用。

三、JDK中的责任链模式

java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值