设计模式(八) — 责任链模式

使编程更有灵活性——责任链模式

责任链模式的定义

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

责任链模式的使用产场景

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

责任链模式的实例

我们假设一个场景,在外出差需要报销费用。例如用了5W块,然后报销,组长只能报销1000以下的,主管只能报销5000以下的,经理只能报销10000以下的,老板则有权限报销任何数字,当然也要老板真能给。这样我们的请求报销就是一个请求,组长、主管、经理、老板则是处理者。

抽象领导者
Leader.class

public abstract class Leader {
    //上一级领导处理者
    protected Leader nextHandler;

    /**
     * description: 处理请求
     */
    public final void handleRequest(int money) {
        if (money <= limit()) {
            handle(money);
        } else {
            nextHandler.handleRequest(money);
        }
    }

    /**
     * description: 能批复的额度
     */
    public abstract int limit();

    /**
     * description: 处理报销
     */
    public abstract void handle(int money);
}

各个具体的领导者
GroupLeader.class

/**
 * description: 组长处理者
 */
public class GroupLeader extends Leader {
    private static final String TAG = "GroupLeader";

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

    @Override
    public void handle(int money) {
        Log.i(TAG, "组长批复报销" + money + "元");
    }
}

DirectorLeader.class

/**
 * description: 主管处理者
 */
public class DirectorLeader extends Leader {
    private static final String TAG = "DirectorLeader";

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

    @Override
    public void handle(int money) {
        Log.i(TAG, "主管批复报销" + money + "元");
    }
}

ManagerLeader.calss

/**
 * description: 经理处理者
 */
public class ManagerLeader extends Leader {
    private static final String TAG = "ManagerLeader";

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

    @Override
    public void handle(int money) {
        Log.i(TAG, "经理批复报销" + money + "元");
    }
}

Boss.class

/**
 * description: 老板处理者
 */
public class Boss extends Leader {
    private static final String TAG = "Boss";

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

    @Override
    public void handle(int money) {
        Log.i(TAG, "老板批复报销" + money + "元");
    }
}

请求发起
Requester.calss

扫描二维码关注公众号,回复: 3431889 查看本文章
public class Requester {
    public void request() {
        //构造各个领导者
        GroupLeader groupLeader = new GroupLeader();
        DirectorLeader directorLeader = new DirectorLeader();
        ManagerLeader managerLeader = new ManagerLeader();
        Boss boss = new Boss();

        //设置上一级领导处理者对象
        groupLeader.nextHandler = directorLeader;
        directorLeader.nextHandler = managerLeader;
        managerLeader.nextHandler = boss;

        //请求者发起请求
        groupLeader.handleRequest(50000);
    }
}

其实责任链模式就像是我们写if…else…,如果你有兴趣,完全可以使用责任链模式来替代各种分支或条件判断语句,不过大多数都是多此一举。当分支中需要有很多的操作时,运用责任链模式,可以减少方法的赋值度。

小结

优点

可以对请求者和处理者关系解耦,提高代码的灵活性。

缺点

对链中请求处理者的遍历,如果处理者太多,那么遍历必定会影响性能,特别是在一些递归调用中,要慎用。

猜你喜欢

转载自blog.csdn.net/kavenka/article/details/82914607