美文网首页Android设计模式
责任链模式(可以让多个对象可能都能够处理某个请求)

责任链模式(可以让多个对象可能都能够处理某个请求)

作者: 钉某人 | 来源:发表于2017-11-18 17:01 被阅读5次
源码地址 https://github.com/DingMouRen/DesignPattern
简化版责任链模式.png
  • Handler 抽象处理者,声明一个请求处理的方法,并在其中保持一个对下一个处理节点Handler对象的引用
  • ConcreteHandler 具体处理者,对请求进行处理,如果不能处理就将该请求转发给下一个节点上的处理兑对象
定义

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

使用场景
  • 多个对象可以处理同一请求,但具体哪个对象处理需要在运行时动态决定
  • 在请求处理者不明确的情况下向多个对象中的一个提交一个请求
  • 需要动态指定一组对象处理请求
协作

当客户端提交一个请求时,请求沿链传递直至一个ConcreteHandler对象负责处理它

非简化版责任链模式.png
非简化版责任链模式的代码演示请到源码
举个栗子

出差报账是经常遇到的,在公司里如果额度很大的话,就得一级一级的向上申报,每级领导审批的额度是有最大限制的,这里就用这个例子。但是这里不再将请求封装成对象了,报账的额度就是请求。

//抽象处理者:领导们╮(╯▽╰)╭
public abstract class Leader {
    public Leader nextLeader;//上一任领导,对应下一个处理者对象

    /**
     * 处理报账
     * @param money 请求报账的额度
     */
    public final void handleRequest(int money){
        if (money <= limit()){
            handle(money);
        }else {
            if (null != nextLeader) nextLeader.handleRequest(money);
        }
    }

    /**
     * 自身能够批复的最大额度
     * @return 返回额度
     */
    public abstract int limit();

    /**
     * 处理报账的具体行为
     * @param money
     */
    public abstract void handle(int money);
}
//具体处理者:组长
public class GroupLeader extends Leader {
    @Override
    public int limit() {
        return 1000;
    }

    @Override
    public void handle(int money) {
        System.out.println(getClass().getSimpleName()+"批复了"+money);
    }
}
//具体处理者:主管
public class Director extends Leader{
    @Override
    public int limit() {
        return 5000;
    }

    @Override
    public void handle(int money) {
        System.out.println(getClass().getSimpleName()+"批复了"+money);
    }
}

使用
    public static void main(String[] args) {
        //构建处理者对象:领导们
        Leader groupLeader = new GroupLeader();
        Leader directorLeader = new Director();
        Leader managerLeader = new Manager();
        Leader  boss = new Boss();
        //设置处理的责任链关系
        groupLeader.nextLeader = directorLeader;
        directorLeader.nextLeader = managerLeader;
        managerLeader.nextLeader = boss;
        //发起报账的请求
        groupLeader.handleRequest(3000);
    }
总结

责任链模式优点是实现了请求者和处理者关系的解耦,提高了代码的灵活性。最大的缺点就是在链中请求处理者的遍历。如果处理者太多,那么遍历就会影响性能咯。

相关文章

  • 责任链模式(可以让多个对象可能都能够处理某个请求)

    Handler 抽象处理者,声明一个请求处理的方法,并在其中保持一个对下一个处理节点Handler对象的引用 Co...

  • java设计模式13(责任链模式)

    在系统中如果存在多个对象可以处理同一请求,则可以通过责任链模式将这些处理请求的对象连成一条链,让请求沿着该链进行传...

  • 责任链模式

    责任链模式的定义与特点 责任链(Chain of Responsibility)模式:使多个对象都有机会处理请求,...

  • 责任链模式与 OkHttp

    什么是责任链模式 OkHttp中责任链模式的实现 一、什么是责任链模式 使多个对象都有机会处理请求,从而避免了请求...

  • Swift的责任链模式

    责任链模式:当多个对象可以响应一个请求,可以将这些对象组成链,请求在这个链上传递,直到链上的某一个对象处理此请求或...

  • 设计模式 - 责任链模式

    模式定义 责任链模式(Chain of Responsibility Pattern) 使多个对象都有机会处理请求...

  • 设计模式学习_03责任链模式

    1、责任链模式介绍: 责任链模式是行为型设计模式之一; 2、责任链模式的定义: 使多个对象都有机会处理请求, 从而...

  • 责任链模式

    定义 当你想要让一个以上的对象有机会能够处理某个请求的时候,就是用责任链模式。 使用场景 有多个对象要处理请求,并...

  • JS设计模式之责任链模式

    什么是“责任链模式”? 责任链模式定义:为请求创建了一个接收者对象的链。多个对象均有机会处理请求,从而解除发送者和...

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

    责任链模式用于弱化请求发生者和请求处理者之间的关系。当多个对象都可以对请求进行处理,但不同的对象能处理的请求类型不...

网友评论

    本文标题:责任链模式(可以让多个对象可能都能够处理某个请求)

    本文链接:https://www.haomeiwen.com/subject/pnaevxtx.html