当客户端发出一个请求,有多个对象都有机会来处理这个请求,但是客户端不知道究竟谁会来处理他的请求时,这是就可以使用责任链模式来处理这种情况。
1、定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
2、使用场景
- 多个对象可以处理一个请求,但具体由哪个对象处理则在运行时动态决定。
- 在请求者不明确的情况下向多个对象中的一个提交一个请求。
- 需要动态指定一组对象处理请求。
3、UML图
4、示例代码
public abstract class Handler {
/**
* 持有后继的责任对象
*/
protected Handler successor;
/**
* 示意处理请求的方法,虽然这个示意方法是没有传入参数的
* 但实际是可以传入参数的,根据具体需要来选择是否传递参数
*/
public abstract void handleRequest();
/**
* 设置后继的责任对象
*/
public void setSuccessor(Handler successor) {
this.successor = successor;
}
}
public class ConcreteHandler1 extends Handler {
/**
* 处理方法,调用此方法处理请求
*/
@Override
public void handleRequest() {
/**
* 根据某些条件来判断是否属于自己处理的职责范围
*/
boolean condition = false;
if (condition) {
System.out.println("ConcreteHandler1 处理请求");
} else {
if(successor != null) {
System.out.println("ConcreteHandler1 处理不了,交给下个 handler 处理请求");
successor.handleRequest();
}
}
}
}
public class ConcreteHandler2 extends Handler {
@Override
public void handleRequest() {
/**
* 根据某些条件来判断是否属于自己处理的职责范围
*/
boolean condition = true;
if (condition) {
System.out.println("ConcreteHandler2 处理请求");
} else {
if(successor != null) {
System.out.println("交给下个 handler 处理请求");
successor.handleRequest();
}
}
}
}
客户端调用:
public class Client {
public static void main(String args[]) {
// 组装责任链
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
handler1.setSuccessor(handler2);
// 提交请求
handler1.handleRequest();
}
}
结果输出:
责任链模式的本质是分离职责,动态组合。