携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情
1.意图:
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
2.适用性:
有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。 你想在不明确制定接受者的情况下,向多个对象中的一个提交一个请求。 可处理一个请求的对象集合应被动态指定。
3.责任链(Responsibility)模式的构成:
- 传递者接口(Handler):定义一个处理请求的接口,实现链中下一个对象(可选)
- 具体传递者(ConcreteHandler):可以访问链中下一个对象,如果可以处理请求,就处理它,否则将请求转发给后继者
- 客户端(Client):向链中的对象发出请求
4.责任链模式UML类图:
5.责任链模式UML序列图:
6.代码示例:
客户端:
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);
}
}
}