【设计模式】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

相关文章
|
2月前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
47 0
[Java]23种设计模式
|
18天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
2月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
3月前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
3月前
|
设计模式 存储 算法
Java设计模式-命令模式(16)
Java设计模式-命令模式(16)
|
3月前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
|
3月前
|
设计模式 安全 Java
Java设计模式-迭代器模式(21)
Java设计模式-迭代器模式(21)
|
3月前
|
设计模式 缓存 监控
Java设计模式-责任链模式(17)
Java设计模式-责任链模式(17)
|
3月前
|
设计模式 运维 算法
Java设计模式-策略模式(15)
Java设计模式-策略模式(15)
|
3月前
|
设计模式 算法 Java
Java设计模式-模板方法模式(14)
Java设计模式-模板方法模式(14)