责任链(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

设计模式 - 责任链 - 图2