美文网首页
责任链模式

责任链模式

作者: 1dot4 | 来源:发表于2019-02-18 19:33 被阅读0次

定义

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

UML类图

zerenlian.png
  • Handler:抽象处理者角色,声明一个请求处理的方法,并且在其中保持一个对下一个处理节点Handler对象的引用。
  • ConcreteHander:具体处理者角色,对请求进行处理,如果不能处理就转给下一个节点上的处理对象

简单实现

场景设置:出差回来后,请求报销旅费。

public abstract class Leader {
    protected Leader nextLeader;

    public final void handerRequest(int money){
        if(money <=limit()){
            handle(money);
        }else {
            if(nextLeader!=null){
                nextLeader.handerRequest(money);
            }
        }
    }

    /**
     * 自身能批复的额度
     * @return
     */
    protected  abstract  int limit();

    public abstract  void  handle(int money);
}

public class GroupLeader extends Leader {
    @Override
    protected int limit() {
        return 1000;
    }

    @Override
    public void handle(int money) {
        System.out.println("组长批复报销:"+money+"元");
    }
}
public class Director extends Leader {
    @Override
    protected int limit() {
        return 5000;
    }

    @Override
    public void handle(int money) {
        System.out.println("主管批复报销:"+money+"元");
    }
}
public class Manager extends Leader {
    @Override
    protected int limit() {
        return 10000;
    }

    @Override
    public void handle(int money) {
        System.out.println("经理批复报销:"+money+"元");
    }
}

public class Boss extends Leader {
    @Override
    protected int limit() {
        return Integer.MAX_VALUE;
    }

    @Override
    public void handle(int money) {
        System.out.println("老板批复报销:"+money+"元");
    }
}

“我”先向组长申请报账。

public class Me {

    public static void main(String[] args) {
        GroupLeader groupLeader=new GroupLeader();
        Director director=new Director();
        Manager manager=new Manager();
        Boss boss=new Boss();

        groupLeader.nextLeader=director;
        director.nextLeader=manager;
        manager.nextLeader=boss;

        groupLeader.handerRequest(7000);

    }
}

最终程序走到“经理”这边就结束了,不需要打扰老板。那么是不是可以直接越过组长直接找“经理”报账呢? 答案是肯定的,这也责任链模式的灵活之处。

对于一个责任链来说,一个请求最终由两个情况,一是被某个处理对象处理,二是所有对象均未对其处理。在实际应用中,我们所见的责任链大多是第二种情况。

Android源码中的责任链实现

最经典的实现就是事件的分发处理了,这里就不贴代码,请看图:

touchEvent.png

ViewGroup事件传递的递归调用就类似于一条责任链,一旦寻找到责任者,那么将由责任者持有并消费掉该次事件。具体体现在View的onTouchEvent方法中返回值的设置,如果onTouchEvent返回false,那么意味着当前View不会是该次事件的责任人,将不会对其持有;如果为true则相反,此时View会持有该事件并不再向外传递。

相关文章

网友评论

      本文标题:责任链模式

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