原文:https://github.com/CyC2018/CS-Notes

责任链(Chain Of Responsibility)

职责链模式:避免将请求发送者与接收者耦合在一起,让多个对象都有机会接收请求,将这些对象连接成一条链,并且沿着这条链传递请求。职责链模式是一种对象行为型模式。分为纯责任链模式和不纯责任链模式,纯责任链模式:请求被具体处理器处理,不存在不被处理的请求。不纯责任链:请求被具体处理器处理后,继续往后传递,而且可以最终不被任何处理者对象接收。

Intent

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

Class Diagram

  • Handler:定义处理请求的接口,并且实现后继链(successor)

责任链设计模式 - 图1

Implementation

  1. public abstract class Handler {
  2. protected Handler successor;
  3. public Handler(Handler successor) {
  4. this.successor = successor;
  5. }
  6. protected abstract void handleRequest(Request request);
  7. }
  1. public class ConcreteHandler1 extends Handler {
  2. public ConcreteHandler1(Handler successor) {
  3. super(successor);
  4. }
  5. @Override
  6. protected void handleRequest(Request request) {
  7. if (request.getType() == RequestType.TYPE1) {
  8. System.out.println(request.getName() + " is handle by ConcreteHandler1");
  9. return;
  10. }
  11. if (successor != null) {
  12. successor.handleRequest(request);
  13. }
  14. }
  15. }
  1. public class ConcreteHandler2 extends Handler {
  2. public ConcreteHandler2(Handler successor) {
  3. super(successor);
  4. }
  5. @Override
  6. protected void handleRequest(Request request) {
  7. if (request.getType() == RequestType.TYPE2) {
  8. System.out.println(request.getName() + " is handle by ConcreteHandler2");
  9. return;
  10. }
  11. if (successor != null) {
  12. successor.handleRequest(request);
  13. }
  14. }
  15. }
  1. public class Request {
  2. private RequestType type;
  3. private String name;
  4. public Request(RequestType type, String name) {
  5. this.type = type;
  6. this.name = name;
  7. }
  8. public RequestType getType() {
  9. return type;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. }
  1. public enum RequestType {
  2. TYPE1, TYPE2
  3. }
  1. public class Client {
  2. public static void main(String[] args) {
  3. Handler handler1 = new ConcreteHandler1(null);
  4. Handler handler2 = new ConcreteHandler2(handler1);
  5. Request request1 = new Request(RequestType.TYPE1, "request1");
  6. handler2.handleRequest(request1);
  7. Request request2 = new Request(RequestType.TYPE2, "request2");
  8. handler2.handleRequest(request2);
  9. }
  10. }
  1. request1 is handle by ConcreteHandler1
  2. request2 is handle by ConcreteHandler2

JDK

使用场景

  1. 有多个对象可以处理同一个请求,具体哪个对象处理该请求待运行时刻再确定,客户端只需将请求提交到链上,而无须关心请求的处理对象是谁以及他是如何处理的。
  2. 在不明确接收者的情况下,向多个对象中的一个提交一个请求。
  3. 可动态指定一组对象处理请求,客户端可以动态创建职责链来处理请求,还可以改变链中处理者之间的先后次序。