设计模式

责任链模式(Chain Of Responsibility)

2020-07-21  本文已影响0人  秀儿2020

定义

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

本质

分离职责,动态组合。

登场角色

示例代码

/**
 * 抽象的处理者
 */
public abstract class Leader {
    protected Leader nextLeader;

    /**
     * 自身能报销的额度权限
     * @return
     */
    public abstract int limit();

    /**
     * 处理报销行为
     * @param money
     */
    public abstract void handler(int money);

    /**
     * 处理报账请求
     * @param money
     */
    public final void handlerRequest(int money){
        if(money < limit()){ //如果自己能够处理,就处理
            handler(money);
        }else{
            //如果处理不了,传递给下一个处理者
            if(null != nextLeader){
                nextLeader.handlerRequest(money);
            }
        }
    }
}

/**
 * 处理者
 */
public class GroupLeader extends Leader{
    @Override
    public int limit() {
        return 1000;
    }
    @Override
    public void handler(int money) {
        System.out.println("组长批复报销" + money + "元");
    }
}

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

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



public class Manager extends Leader{
    @Override
    public int limit() {
        return 10000;
    }

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


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

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


public class Main {
    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.handlerRequest(50000);
    }
}

运行结果

老板批复报销50000元

功能

责任链模式主要用来处理”客户端发出一个请求,有多个对象都有机会来处理这一个请求,但是客户端不知道究竟谁会来处理他的请求“这样的情况。也就是需要让请求者和接收者解耦,这样就可以动态的切换和组合接收者了。

优点

缺点

何时使用

上一篇 下一篇

猜你喜欢

热点阅读