架构师之路--责任链模式

目录

介绍

定义

使用场景

代码实现


介绍

     责任链模式是行为型设计模式之一,链很形象的反映了该模式的结构,比如像我们生活中的锁链,是由一个个节点连接起来的,而且每个节点都可以被工再连接,因此,责任链模式也具有很好的灵活性。我们可以将每个节点看作一个对象,每个对象拥有自己独立的处理逻辑,从链首到链尾依次处理,直到所有节点处理完成为止。

定义

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

使用场景

     多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。

     在请求处理者不明确的情况下向多个对象中的一个提交一个请求。

     需要动态指定一组对象处理请求。

代码实现

     我们以公司报销为例来实现一下责任链模式,比如我上个月出差,报销费用为100000,先拿给组长审批,组长权限不够,再上交到经理,经理权限是5000,也不够,再上升到老板那里才审批通过,但是后面的审批流程跟发起者已经没关系了,我们不需要关心,只需要按照已定好的流程进行就可以了。将这种行为抽象一下,每一个审批者有三个特点:1、审批者在权限范围内可以审批通过报销;2、每个审批者有一定的金额范围;3、每个审批者知道自己的下一级审批者是谁,根据这些行为,我们抽象审批者如下:

public abstract class Handler {
    protected Handler nextHandler;

    public void handleRequest(int money) {
        if (money <= limit()) {
            handle(money);
        } else {
            nextHandler.handleRequest(money);
        }
    }

    public abstract int limit();

    public abstract void handle(int money);
}

     然后我们开始从自己发起审批,到达每个审批者,如果权限不够则送到下一级审批者继续审批,代码如下:

public class XiaoMin {

    public static void main() {
        GroupLeader groupLeader = new GroupLeader();
        Manager manager = new Manager();
        Boss boss = new Boss();
        groupLeader.nextHandler = manager;;
        manager.nextHandler = boss;
        groupLeader.handleRequest(100000);
    }
}
public class GroupLeader extends Handler {

    @Override
    public int limit() {
        return 1000;
    }

    @Override
    public void handle(int money) {
        System.out.println("组长同意可以报销: " + money);
    }
}
public class Manager extends Handler {

    @Override
    public int limit() {
        return 5000;
    }

    @Override
    public void handle(int money) {
        System.out.println("经理同意可以报销: " + money);
    }
}
public class Boss extends Handler {

    @Override
    public int limit() {
        return Integer.MAX_VALUE;
    }

    @Override
    public void handle(int money) {
        System.out.println("老板同意可以报销: " + money);
    }
}

     可以看到最后的流程审批发起者已经完全不可见了,这样也就实现了两者的解耦。实际工作中,比如我们的相机要添加各种算法特效,也可以很好的使用责任链模式,假设相机预览现在要加上A、B、C三个算法,或者是动态改变的等等复杂情况,那么我们只需要抽象出来一个决策模块,它的任务就是把需要处理的算法组织成责任链,上下相互衔接起来就好了,而每个算法处理者中都已经赋值好了下一个处理者,这样只需要在入口发起算法特效处理,当责任链处理完,所有的特效都会按照要求添加上去了,当中每个节点的handle方法都可以根据自己的规则进行特殊处理,是不是非常方便??

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红-旺永福

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值