责任链模式

定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些处理请求的对象连成一条链,并沿着这条链传递该请求,直到有对象处理它。简单的说就是为请求创建一个接收此请求对象的链。 责任链模式是行为型设计模式。
适用场景:
一个请求的处理需要多个对象当中的一个或多个协助处理。
类图:
在这里插入图片描述
Handler:抽象的请求处理者,持有一个后继处理者。
ConcreteHandler:具体的请求处理者,在这里个类里面,负责它职责范围内的请求处理,如果不处理,就继续转发请求给后继者。
可以看到,责任链就是当前的请求处理对象持有下一个请求处理对象的引用,下一个也是如此,并且每一个处理对象都有自己的职责范围,这样就形成了一条责任链,请求从链的第一个处理对象传递,直到有对象处理它。

Example:

通常我们在公司上班,遇到突发事件都需要请假,而请假根据天数不同需要不同的主管来同意我们的请求,比如我们要请1-3天的假期一级主管就可以直接同意,不需要再往上请求,如果是4-6天就需要二级主管同意,如果是7-10天就需要3级主管同意,大于10天需要我们的boss来同意才行。现在我们用责任链模式来模拟这个场景。

//处理者基类
public abstract class LeaveHandler {

    //持有指向后继者的引用
    protected LeaveHandler successor;

    //设置后继者
    public void setSuccessor(LeaveHandler successor) {
        this.successor = successor;
    }

    public abstract void handleRequest(int request);
}
//一级主管
public class FirstLevelSupervisor extends LeaveHandler {
    @Override
    public void handleRequest(int request) {
        if (request<=3){
            System.out.println("一级主管已同意");
        }else {
            if (successor!=null){
                //请请求传递给责任链的下一个处理对象处理
                successor.handleRequest(request);
            }
        }
    }
}
//二级主管
public class SecondLevelSupervisor extends LeaveHandler{
    @Override
    public void handleRequest(int request) {
        if (4<=request&&request<=6){
            System.out.println("二级主管已同意");
        }else {
            if (successor!=null){
                //请请求传递给责任链的下一个处理对象处理
                successor.handleRequest(request);
            }
        }
    }
}
//三级主管
public class ThirdLevelSupervisor extends LeaveHandler {
    @Override
    public void handleRequest(int request) {
        if (7<=request&&request<=10){
            System.out.println("三级主管已同意");
        }else {
            if (successor!=null){
                //请请求传递给责任链的下一个处理对象处理
                successor.handleRequest(request);
            }
        }
    }
}
//Boss
public class Boss extends LeaveHandler {
    @Override
    public void handleRequest(int request) {
        System.out.println("Boss已同意");
    }
}
	//Client
    public static void main(String[] args) {
        LeaveHandler firstLevelSupervisor=new FirstLevelSupervisor();
        LeaveHandler secondLevelSupervisor=new SecondLevelSupervisor();
        LeaveHandler thirdLevelSupervisor=new ThirdLevelSupervisor();
        LeaveHandler boss=new Boss();
        //形成责任链
        firstLevelSupervisor.setSuccessor(secondLevelSupervisor);
        secondLevelSupervisor.setSuccessor(thirdLevelSupervisor);
        thirdLevelSupervisor.setSuccessor(boss);

        //向一级主管提交7天的假期申请
        firstLevelSupervisor.handleRequest(7);
    }

结果:

三级主管已同意

在这里插入图片描述

可以看到FirstLevelSupervisor->SecondLevelSupervisor->ThirdLevelSupervisor->Boss形成了一条责任链,当客户提交一个请求时,请求会沿着责任链传递,直到有一个具体的处理者负责处理该请求。

责任链模式的优点

  • 请求的发送者和处理解耦。
  • 可以根据不同的需求进行动态的组合。
  • 增强了给对象指派职责的灵活性,可以很方便的修改、增加、减少责任链中的元素。

责任链模式的缺点
影响性能。当责任链太长,如果只有最后一个可以处理,就会创建许多处理对象并且请求会在它们之间传递。

参考: 大话设计模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值