【设计模式】JAVA Design Patterns——Chain of responsibility(责任链模式)

简介: 【设计模式】JAVA Design Patterns——Chain of responsibility(责任链模式)

🔍目的


通过给多个对象一个处理请求的机会,避免请求的发送者和它的接收者耦合。串联接收对象并在链条中传递请求直到一个对象处理它。


🔍解释


真实世界例子

兽王大声命令他的军队。最近响应的是指挥官,然后是军官,然后是士兵。指挥官,军官,士兵这里就形成了一个责任链。


通俗描述

它帮助构建一串对象。请求从一个对象中进入并结束然后进入到一个个对象中直到找到合适的处理器。


维基百科

在面向对象设计中,责任链模式是一种由源命令对象和一系列处理对象组成的设计模式。每个处理对象包含了其定义的可处理的命令对象类型的逻辑。剩下的会传递给链条中的下一个处理对象。


程序实例

兽人发起了请求(命令),创建请求类

public class Request {
 
  private final RequestType requestType;
  private final String requestDescription;
  private boolean handled;
 
  public Request(final RequestType requestType, final String requestDescription) {
    this.requestType = Objects.requireNonNull(requestType);
    this.requestDescription = Objects.requireNonNull(requestDescription);
  }
 
  public String getRequestDescription() { return requestDescription; }
 
  public RequestType getRequestType() { return requestType; }
 
  public void markHandled() { this.handled = true; }
 
  public boolean isHandled() { return this.handled; }
 
  @Override
  public String toString() { return getRequestDescription(); }
}
 
public enum RequestType {
  DEFEND_CASTLE, TORTURE_PRISONER, COLLECT_TAX
}


创建请求处理器

@Slf4j
public abstract class RequestHandler {
  private final RequestHandler next;
 
  public RequestHandler(RequestHandler next) {
    this.next = next;
  }
 
  public void handleRequest(Request req) {
    if (next != null) {
      next.handleRequest(req);
    }
  }
 
  protected void printHandling(Request req) {
    LOGGER.info("{} handling request \"{}\"", this, req);
  }
 
  @Override
  public abstract String toString();
}
 
public class OrcCommander extends RequestHandler {
  public OrcCommander(RequestHandler handler) {
    super(handler);
  }
 
  @Override
  public void handleRequest(Request req) {
    if (req.getRequestType().equals(RequestType.DEFEND_CASTLE)) {
      printHandling(req);
      req.markHandled();
    } else {
      super.handleRequest(req);
    }
  }
 
  @Override
  public String toString() {
    return "Orc commander";
  }
}
 
// OrcOfficer和OrcSoldier的定义与OrcCommander类似
 


兽王就形成了命令链条

public class OrcKing {
  RequestHandler chain;
 
  public OrcKing() {
    buildChain();
  }
 
  private void buildChain() {
    chain = new OrcCommander(new OrcOfficer(new OrcSoldier(null)));
  }
 
  public void makeRequest(Request req) {
    chain.handleRequest(req);
  }
}


发出命令

var king = new OrcKing();
king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "defend castle")); // Orc commander handling request "defend castle"
king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torture prisoner")); // Orc officer handling request "torture prisoner"
king.makeRequest(new Request(RequestType.COLLECT_TAX, "collect tax")); // Orc soldier handling request "collect tax"


🔍类图

3bb2b8605c944ae3a6ed3d3a77ed8cf8.png

Chain of Responsibility class diagram


🔍适用场景

使用责任链模式

  • 多于一个对象可能要处理请求,并且处理器并不知道一个优先级。处理器应自动确定。
  • 你想对多个对象之一发出请求而无需明确指定接收者
  • 处理请求的对象集合应该被动态指定时

86984b5d895e4a32ac59eab93ed85350.gif

相关文章
|
7月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
801 2
|
设计模式 算法 前端开发
【设计模式】【行为型模式】职责链模式(Chain of Responsibility)
一、入门 什么是职责链模式? 职责链模式是一种行为设计模式,它允许你将请求沿着一条链传递,直到有对象处理它为止。每个对象都有机会处理请求,或者将其传递给链中的下一个对象。 为什么需要职责链模式? 使用
399 16
|
8月前
|
设计模式 人工智能 算法
基于多设计模式的状态扭转设计:策略模式与责任链模式的实战应用
接下来,我会结合实战案例,聊聊如何用「策略模式 + 责任链模式」构建灵活可扩展的状态引擎,让抽奖系统的状态管理从「混乱战场」变成「有序流水线」。
|
设计模式 存储 Java
「全网最细 + 实战源码案例」设计模式——责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,允许将请求沿着处理者链进行发送。每个处理者可以处理请求或将其传递给下一个处理者,从而实现解耦和灵活性。其结构包括抽象处理者(Handler)、具体处理者(ConcreteHandler)和客户端(Client)。适用于不同方式处理不同种类请求、按顺序执行多个处理者、以及运行时改变处理者及其顺序的场景。典型应用包括日志处理、Java Web过滤器、权限认证等。
343 13
「全网最细 + 实战源码案例」设计模式——责任链模式
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
160 9
|
设计模式 缓存 监控
Java设计模式-责任链模式(17)
Java设计模式-责任链模式(17)
318 1
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
194 0
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
149 0
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
本教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速上手Kotlin的读者,推荐查阅“简洁”系列教程。本文通过学生会经费申请的例子,介绍了责任链模式及其在Kotlin中的实现,并使用偏函数进行了改进,使代码更加简洁和灵活。
135 0
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
114 0