概述
- 职责链模式可以将请求的处理者组织成一条链,并让请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,实现请求发送者和请求处理者解耦。
- 定义:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
- 职责链模式是一种对象行为型模式。
- 实现:
- 定义一个抽象处理器。
- 客户端可以定义链路结构,也可以在责任链中定义好链路结构。前者较灵活,后者更封装。
- 多个具体处理角色实现抽象处理器,每个具体处理里面,聚合下一个处理器。
- 如果第一个处理器不做处理则传递给第二个,依次传递,直到最后一个处理。
- 组合出来的链应该是递归调用的。
- 注意:责任链需要控制处理链的长度。
- 学习难度:★★★☆☆
- 使用频率:★★☆☆☆
优缺点
类图
组成角色
- 抽象处理角色(Handler)
- 具体处理者角色(ConcreteHandler)
Code Example
抽象处理角色(Handler)
public abstract class Handler {
private Handler handler;
public abstract String handleRequest(Long number);
public Handler getHandler() {
return handler;
}
public void setHandler(Handler handler) {
this.handler = handler;
}
}
具体处理者角色(ConcreteHandler)
public class HandlerImplOne extends Handler {
@Override
public String handleRequest(Long number) {
if (number > 10) {
return "大于10跳出!";
} else if (null != getHandler()) {
return getHandler().handleRequest(number);
}
return "全部通过了!";
}
}
public class HandlerImplTwo extends Handler {
@Override
public String handleRequest(Long number) {
if (number > 8) {
return "大于8退出了!";
} else if (null != getHandler()) {
return getHandler().handleRequest(number);
}
return "全部通过了!";
}
}
public class HandlerImplThree extends Handler {
@Override
public String handleRequest(Long number) {
if (number > 3) {
return "大于3退出了!";
} else if (null != getHandler()) {
return getHandler().handleRequest(number);
}
return "全部通过了!";
}
}
客户端
public class Responsibility {
public static void main(String[] args) {
System.out.println("请输入你要处理的数字:");
Scanner input = new Scanner(System.in);
Long testObject = input.nextLong();
Handler handler1 = new HandlerImplOne();
Handler handler2 = new HandlerImplTwo();
Handler handler3 = new HandlerImplThree();
handler1.setHandler(handler2);
handler2.setHandler(handler3);
String info = handler1.handleRequest(testObject);
System.out.println(info);
}
}