美文网首页设计模式
责任链模式(Chain Of Responsibility)

责任链模式(Chain Of Responsibility)

作者: 秀儿2020 | 来源:发表于2020-07-21 14:38 被阅读0次

定义

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

本质

分离职责,动态组合。

登场角色

  • Handler(处理者)

    定义了处理请求的接口,处理者角色知道下一个处理者是谁,如果自己无法处理该请求,他会将请求传递给下一个处理者。

  • ConcreteHandler(具体的处理者)

    处理请求的具体角色。

  • Client(请求者)

    向第一个处理者发送请求的角色。

示例代码

/**
 * 抽象的处理者
 */
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元

功能

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

优点

  • 请求者和接收者松散耦合。
  • 动态组合职责。把功能护理分散到单独的职责对象总,然后在使用的时候,可以动态的组合职责形成职责链,从而可以灵活的给对象分噢诶职责,也可以灵活的实现或者改变对象的职责。

缺点

  • 产生很多细粒度的对象。
  • 不一定能被处理。

何时使用

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

相关文章

网友评论

    本文标题:责任链模式(Chain Of Responsibility)

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