首页 > 其他分享 >设计模式Chain of Responsibility(责任链)

设计模式Chain of Responsibility(责任链)

时间:2024-08-27 19:15:27浏览次数:10  
标签:请求 Chain 处理 Handler Responsibility 设计模式 public

Chain of Responsibility(责任链)模式是一种行为型设计模式,用于处理请求的多个处理者之间的职责分配。它允许请求沿着一条处理链传递,直到有一个处理者能够处理它为止。这种模式可以避免请求发送者和请求处理者之间的紧耦合关系。

主要概念

  • Handler(处理者):定义了处理请求的接口,并实现具体的处理逻辑。如果该处理者无法处理请求,它会将请求传递给链中的下一个处理者。
  • ConcreteHandler(具体处理者):实现了Handler接口,处理请求。如果无法处理请求,它会将请求传递给链中的下一个处理者。
  • Client(客户端):发起请求,并将请求传递给链中的第一个处理者。

主要角色

  1. Handler(处理者):定义了一个接口来处理请求,提供了设置和获取下一个处理者的机制。
  2. ConcreteHandler(具体处理者):实现了Handler接口,处理请求。如果无法处理,则将请求传递给链中的下一个处理者。
  3. Client(客户端):将请求传递给链中的第一个处理者。

示例代码

以下是一个简单的Chain of Responsibility模式的Java示例。假设我们有一个日志处理系统,每个处理者可以处理不同级别的日志请求(比如错误、警告和信息)。如果一个处理者无法处理该请求,它会将请求传递给链中的下一个处理者。

java // Handler接口 abstract class Logger { public static int INFO = 1; public static int DEBUG = 2; public static int ERROR = 3; protected int level; protected Logger nextLogger; public void setNextLogger(Logger nextLogger) { this.nextLogger = nextLogger; } public void logMessage(int level, String message) { if (this.level <= level) { write(message); } if (nextLogger != null) { nextLogger.logMessage(level, message); } } abstract protected void write(String message); } // 具体处理者:控制台日志 class ConsoleLogger extends Logger { public ConsoleLogger(int level) { this.level = level; } @Override protected void write(String message) { System.out.println("Console Logger: " + message); } } // 具体处理者:文件日志 class FileLogger extends Logger { public FileLogger(int level) { this.level = level; } @Override protected void write(String message) { System.out.println("File Logger: " + message); } } // 具体处理者:错误日志 class ErrorLogger extends Logger { public ErrorLogger(int level) { this.level = level; } @Override protected void write(String message) { System.out.println("Error Logger: " + message); } } // 客户端代码 public class ChainOfResponsibilityDemo { private static Logger getChainOfLoggers() { Logger errorLogger = new ErrorLogger(Logger.ERROR); Logger fileLogger = new FileLogger(Logger.DEBUG); Logger consoleLogger = new ConsoleLogger(Logger.INFO); errorLogger.setNextLogger(fileLogger); fileLogger.setNextLogger(consoleLogger); return errorLogger; } public static void main(String[] args) { Logger loggerChain = getChainOfLoggers(); loggerChain.logMessage(Logger.INFO, "This is an information."); loggerChain.logMessage(Logger.DEBUG, "This is a debug level information."); loggerChain.logMessage(Logger.ERROR, "This is an error information."); } }

解释

  1. Logger:抽象类,定义了处理请求的方法和设置下一个处理者的方法。还定义了日志级别。
  2. ConsoleLogger、FileLogger、ErrorLogger:具体的处理者类,实现了write方法,处理不同级别的日志请求。
  3. ChainOfResponsibilityDemo:客户端代码,设置了处理链并发送不同级别的日志请求。

优点

  • 解耦:请求的发送者和处理者之间解耦,增加了灵活性。
  • 可扩展性:可以在链中添加新的处理者而无需修改现有代码。
  • 动态改变链结构:可以在运行时动态调整处理链的结构。

缺点

  • 调试难度:链的结构可能会使调试变得复杂,因为请求可能会被传递到链的多个处理者中。

Chain of Responsibility模式特别适用于需要处理多个请求的系统,能够有效地处理请求和分配责任。

标签:请求,Chain,处理,Handler,Responsibility,设计模式,public
From: https://www.cnblogs.com/spicy-food/p/18383349

相关文章

  • wrapper chain
    芯片的规模大小决定了DFT的架构,对于小芯片而言,我们可以把一整个芯片独立测试,甚至都不需要对其内部的chain进行压缩,而对于大芯片而言,如果把一整个芯片当作测试对象,那么无论是对于工具开发商而言还是对于测试时间而言,都是一个巨大的挑战。甚至在很多时候,由于pad的限制,我们无法做......
  • 设计模式FlyWeight 享元模式
    Flyweight模式的核心思想是将对象的可共享部分抽取出来,以避免重复创建相同内容的对象。换句话说,Flyweight模式允许多个对象共享相同的数据来节省内存。 示例代码java复制代码importjava.util.HashMap;importjava.util.Map;//Flyweight接口interfaceShape{voiddr......
  • 设计模式 bridge & decorator
     目的Decorator模式:用于动态地给对象添加新的功能,而不改变其结构。它通过将对象放入一个装饰器类中,在运行时为对象添加额外的行为。这种模式通常用于需要对类的功能进行组合或扩展的场景。Bridge模式:用于将抽象部分与其实现部分分离,以便它们可以独立地变化。桥接模式的......
  • 设计模式--适配器模式
    适配器模式适配器模式(AdapterPattern)是一种结构型设计模式,它允许一个接口(通常是新的或现有的)与另一个不兼容的接口一起工作。适配器模式主要用于解决接口不匹配的问题,让原本由于接口不兼容而不能一起工作的类可以一起工作。下面,我将通过一个简单的例子来展示适配器模式的......
  • 【Kotlin设计模式】Kotlin实现外观模式
    前言外观模式(FacadePattern)是一种结构型设计模式,旨在为子系统中的一组接口提供一个统一的接口。外观模式定义了一个高层接口,使得这一子系统更加容易使用。它将复杂的子系统封装在一个简单的接口后面,从而降低了客户端的复杂性。实现我们以银行APP业务举个例子,其中包......
  • 行为型设计模式-模板方法(template method)模式
    通俗示例想象一下你正在制作一杯咖啡,制作咖啡的步骤大致相同,但有些步骤可以根据个人口味进行调整,比如选择咖啡豆、添加糖和奶等。在这种情况下,可以定义一个“制作咖啡”的模板,它规定了制作咖啡的基本步骤,但将某些步骤的具体实现留给子类完成。这就是模板方法模式的一个例子......
  • vue-cli中webpack-chain 与 configureWebpack 常用配置
    vue-cli文档1.webpack-chain1.定义通过链式调用操作webpack配置对象。(chain:链子)直接修改配置对象chainWebpack通过链式编程的形式,来修改默认的webpack配置2.包含的对象ChainedMap和ChainSet1.ChainedMap//1、从Map移除所有配置clear()//2、通过键值从Map......
  • vue-cli中chainWebpack的使用
    前言在项目开发中我们难免碰到需要对webpack配置更改的情况,今天就主要来讲一下在vue.config.js中对一些配置的更改,简单介绍一下loader的使用;用configureWebpack简单的配置;用chainWebpack做高级配置;包括对loader的添加,修改;以及插件的配置1、首先简单介绍一下webpack中loader的简......
  • langchain(基础)一
    1 Langchain概述(1)LangChain是一个基于语言模型开发应用程序的框架。(2)LangChain为特定用例提供了多种组件,例如个人助理、文档问答、聊天机器人、查询表格数据、与API交互、提取、评估和汇总。(3)LangChain中的模型分类:LLM(大型语言模型):这些模型将文本字符串作为输入......
  • C++ 设计模式——享元模式
    C++设计模式——享元模式C++设计模式——享元模式1.主要组成成分2.享元模式内部状态3.享元模式外部状态4.逐步构建享元模式4.1抽象享元类定义4.2具体享元类实现4.3享元工厂类实现4.4主函数5.享元模式UML图享元模式UML图解析6.享元模式的优点7.享元模......