5 行为型模式之 - 责任链模式
九路 422 11

责任链模式介绍:

责任链模式是行为模式之一,什么是“链”?我们将多个节点首尾相连,就形成了链,对于链式结构,每个节点都可以拆开再重新连接,因此链式结构也具有很好的灵活性。将这样一种结构应用于编程领域,将每一个节点看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从一个链的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止,我们将这样的一种模式称为责任链模式。

责任链模式的定义:

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

使用场景

多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。 在请求处理者不明确的情况下向多个对象中的一个提交一个请求

例子:我们以工作中报销费用为例子,一般我们先找组长报销,组长的权限是一定的,只能报一定范围内的钱,如果走出了组长的权限,我们就要向经理报,如果经理也报不了,就向总监报销,如果连总监也报不了,就直接发给老板报销,如果老板也报不了那就真的报不了啦。但是如果中间任何一个报销了,就返回,不再往上申请了。

代码如下:

/**
 *
 * 使多个对象都有计划处理请求,从而避免请求的发送者和接受者之间的耦合关系。
 * 将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
 *
 */
public abstract class Leader {
    protected Leader preLeader;   //上一级的领导

    public final void handleRequest(int money){
        if(handler(money)){
            return;
        }

        if(preLeader != null){
            preLeader.handleRequest(money);
        }
    }

    public void setPreLeader(Leader leader){
        this.preLeader = leader;
    }

    //自已能批复的最大的报销额度
    protected abstract int limit();

    //处理报销行为
    protected abstract boolean handler(int money);

}

组长:

/**
 * 组长
 * 只多只能报1000元以内的
 */
public class GroupLeader extends Leader{
    @Override
    protected int limit() {
        return 1000;
    }

    @Override
    protected boolean handler(int money) {
        if(money > limit()){
            return false;
        }

        System.out.println("组长批准了报销");
        return true;
    }
}

主管:

/**
 * 主管
 */
public class Director extends Leader{
    @Override
    protected int limit() {
        return 5000;
    }

    @Override
    protected boolean handler(int money) {
        if(money > limit()){
            return false;
        }

        System.out.println("主管批准了报销");
        return true;
    }
}

经理

/**
 * 经理
 * 最多可以报 10000
 */
public class Manager extends Leader{
    @Override
    protected int limit() {
        return 10000;
    }

    @Override
    protected boolean handler(int money) {
        if(money > limit()){
            return false;
        }

        System.out.println("经理批准了报销");
        return true;
    }
}

老板:不受限制

/**
 * 老板
 * 不限制
 */
public class Boss extends Leader{

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

    @Override
    protected boolean handler(int money) {
        if(money > limit()){
            return false;
        }

        System.out.println("老板批准了报销");
        return true;
    }
}

测试类如下:

/**
 * 责任链模式,有两种情况:
 * 1 先自己处理,自己处理不了,再交给上级处理
 * 2 先交给上级处理,上级处理不了,再自己处理(比如类的加载机制)
 */
public class ChainTest {

    public static void main(String[] args){
        Leader groupLeader = new GroupLeader();
        Leader directorLeader = new Director();
        Leader boss = new Boss();

        groupLeader.setPreLeader(directorLeader);
        directorLeader.setPreLeader(boss);
        boss.setPreLeader(null);

        groupLeader.handleRequest(50000);

    }


}

上的例子报销请求一级一级的往上传,直到有一个对象请求为止

评论区

索引目录