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

1.定义

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

2.使用场景

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

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

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

3.简单实现

以一个费用报销为例。组长只能审批1000元以下费用,主管能审批5000元以下费用,经理能审批10000元以下费用,一万元以上需要老板审批。

//领导抽象
abstract class Leader{
    //上一级领导处理  即 下一个处理节点
    protected Leader nextHandler;
    //自身能审批额度
    abstract int limit();
    //处理报销行为
    abstract void handle(int money);

    //处理报销请求
    final void handleRequest(int money){
        if (money <= limit()){
            handle(money);
        }else {
            //交给下一节点
            if (null != nextHandler){
                nextHandler.handleRequest(money);
            }
        }
    }
}

//组长
class GroupLeader extends Leader{

    @Override
    int limit() {
        //限额1000
        return 1000;
    }

    @Override
    void handle(int money) {
        System.out.println("组长批复报销" + money + " 元");
    }
}

//主管
class Director extends Leader{

    @Override
    int limit() {
        //限额5000
        return 5000;
    }

    @Override
    void handle(int money) {
        System.out.println("主管批复报销" + money + " 元");
    }
}

//经理
class Manager extends Leader{

    @Override
    int limit() {
        //限额10000
        return 10000;
    }

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

//Boss
class Boss extends Leader{

    @Override
    int limit() {
        //无限
        return Integer.MAX_VALUE;
    }

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

public class RespChainMode {

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

        //设置交给上级处理
        groupLeader.nextHandler = director;
        director.nextHandler = manager;
        manager.nextHandler = boss;

        //请求报销
        groupLeader.handleRequest(3489);
        groupLeader.handleRequest(20210);
    }
}

输出:

4.小结

优点:

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

缺点:

对请求处理者需要遍历,如果处理者太多影响性能,特别是在一些递归调用中。

猜你喜欢

转载自blog.csdn.net/huxing0215/article/details/84255044