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

相关文章
|
1天前
|
设计模式 开发框架 Java
java设计模式面试题大全含答案
java设计模式面试题大全含答案
|
2天前
|
设计模式 监控 安全
屏幕监控软件的设计模式:深入理解Java EE
在Java EE环境中,屏幕监控软件采用生产者-消费者设计模式,`ScreenCaptureProducer`类捕获屏幕数据并放入队列,`ScreenCaptureConsumer`负责处理和提交。数据每5分钟通过定时任务和RESTful API自动提交至网站,提升管理效率。该方案支持实时监控、数据分析和高效的数据处理。
18 2
|
8天前
|
设计模式 存储 安全
Java中的23种设计模式
Java中的23种设计模式
9 1
|
2天前
|
设计模式 Java Spring
java设计模式总结
java设计模式总结
|
26天前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
23天前
|
设计模式 存储 前端开发
Java的mvc设计模式在web开发中应用
Java的mvc设计模式在web开发中应用
|
1天前
|
Java 程序员
从菜鸟到大神:JAVA多线程通信的wait()、notify()、notifyAll()之旅
【6月更文挑战第21天】Java多线程核心在于wait(), notify(), notifyAll(),它们用于线程间通信与同步,确保数据一致性。wait()让线程释放锁并等待,notify()唤醒一个等待线程,notifyAll()唤醒所有线程。这些方法在解决生产者-消费者问题等场景中扮演关键角色,是程序员从新手到专家进阶的必经之路。通过学习和实践,每个程序员都能在多线程编程的挑战中成长。
|
1天前
|
缓存 安全 Java
Java线程面试题含答案
Java线程面试题含答案
|
1天前
|
Java
并发编程的艺术:Java线程与锁机制探索
【6月更文挑战第21天】**并发编程的艺术:Java线程与锁机制探索** 在多核时代,掌握并发编程至关重要。本文探讨Java中线程创建(`Thread`或`Runnable`)、线程同步(`synchronized`关键字与`Lock`接口)及线程池(`ExecutorService`)的使用。同时,警惕并发问题,如死锁和饥饿,遵循最佳实践以确保应用的高效和健壮。
8 2
|
1天前
|
算法 安全 网络协议
java高级面试题_java面试题大全带答案_线程面试题_java面试宝典2019
java高级面试题_java面试题大全带答案_线程面试题_java面试宝典2019