[23种设计模式][行为型]08.责任链模式

80 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

1.意图:

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

2.适用性:

有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。 你想在不明确制定接受者的情况下,向多个对象中的一个提交一个请求。 可处理一个请求的对象集合应被动态指定。

3.责任链(Responsibility)模式的构成:

  1. 传递者接口(Handler):定义一个处理请求的接口,实现链中下一个对象(可选)
  2. 具体传递者(ConcreteHandler):可以访问链中下一个对象,如果可以处理请求,就处理它,否则将请求转发给后继者
  3. 客户端(Client):向链中的对象发出请求

4.责任链模式UML类图:

Image.png

5.责任链模式UML序列图:

Image.png

6.代码示例:

Image.png

客户端:

public class Client {

    public static void main(String[] args) {
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        Handler handlerC = new ConcreteHandlerC();

        handlerA.setHandler(handlerB);
        handlerB.setHandler(handlerC);

        int[] requests = {1, 5, 2, 20, 22, 16, 9, 17, 25, 3};

        for (int request : requests) {
            handlerA.handlerRequest(request);
        }
    }
}

传递者接口:

public abstract class Handler {

    public Handler handler;

    public void setHandler(Handler handler) {
        this.handler = handler;
    }

    public abstract void handlerRequest(int request);
}

具体传递者接口:

public class ConcreteHandlerA extends Handler {

    @Override
    public void handlerRequest(int request) {
        if (request >= 0 && request <= 10) {
            System.out.println("ConcreteHandler A 处理");
        } else if (handler != null) {
            handler.handlerRequest(request);
        }
    }
}
public class ConcreteHandlerB extends Handler {

    @Override
    public void handlerRequest(int request) {
        if (request >= 11 && request <= 20) {
            System.out.println("Concretehandler B 处理");
        } else if (handler != null) {
            handler.handlerRequest(request);
        }
    }
}
public class ConcreteHandlerC extends Handler {

    @Override
    public void handlerRequest(int request) {
        if (request >= 21 && request <= 30) {
            System.out.println("ConcreteHandler C 处理");
        } else if (handler != null) {
            handler.handlerRequest(request);
         }
    }
}