描述
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着处理链进行传递,直到其中一个处理器处理请求为止。
在责任链模式中,有一个处理器链,每个处理器都尝试处理请求,如果自己不能处理,它会将请求传递给链中的下一个处理器,直到请求被处理为止。
实现
处理器抽象
public abstract class Handler {
protected Handler next;
public Handler(){}
abstract boolean handle();
Handler addHandler(Handler next){
this.next = next;
return this;
}
}
处理器实现
public class AuthHandler extends Handler{
@Override
boolean handle() {
System.out.println("Unseccess Auth");
return false;
}
}
public class LogHandler extends Handler{
@Override
boolean handle() {
System.out.println("Log Handle");
return true;
}
}
请求抽象
public abstract class Request {
protected Handler head;
public Request(Handler head) {
this.head = head;
}
abstract void progress();
}
请求实现
public class HttpRequest extends Request {
public HttpRequest(Handler head) {
super(head);
}
@Override
void progress() {
Handler handler = head;
while (null != handler) {
if (handler.handle()) handler = handler.next;
else handler = null;
}
}
}
客户端
public class Client {
public static void main(String[] args) {
Handler handler = new AuthHandler().addHandler(new LogHandler());
Request request = new HttpRequest(handler);
request.progress();
}
}
实现结果
使用场景
-
请求的处理需要按照一定的顺序进行。例如,一个订单需要先进行库存检查,然后进行价格计算,最后进行支付操作。这个过程中,如果库存不足,则无法进行价格计算和支付操作。
-
一个请求可能需要被多个处理器处理。例如,一个订单可能需要经过多个审核流程,每个审核者都需要审核订单的不同方面。在这种情况下,责任链模式可以将整个审核流程分解成多个处理器。
-
在不知道请求应该由哪个处理器来处理时,可以使用责任链模式。例如,一个电商网站可能需要根据用户的位置选择不同的仓库进行发货,但是网站并不知道用户的位置,可以使用责任链模式,将请求传递给多个处理器,每个处理器都尝试进行用户位置的获取,直到成功获取为止。
-
请求的处理需要动态地进行配置和更改。例如,一个流程中某个处理器的行为需要根据某个条件进行变化,可以使用责任链模式来实现。