当前位置: 首页 > article >正文

责任链模式(Chain Responsibility)

一、定义:属于行为型设计模式,包含传递的数据、创建处理的抽象和实现、创建链条、将数据传递给顶端节点;

二、UML图

三、实现

1、需要传递处理的数据类

import java.util.Date;

/**
 * 需要处理的数据信息
 */
public class RequestData {

    private Long id;

    private String message;

    private Date date;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "RequestData{" +
                "id=" + id +
                ", message='" + message + '\'' +
                ", date=" + date +
                '}';
    }
}

2、抽象处理类(也可以是接口)

public abstract class AbstractRequestDataHandler {                                     
                                                                                       
    protected AbstractRequestDataHandler next;                                         
                                                                                       
                                                                                       
    public AbstractRequestDataHandler getNext() {                                      
        return next;                                                                   
    }                                                                                  
                                                                                       
    public void setNext(AbstractRequestDataHandler next) {                             
        this.next = next;                                                              
    }                                                                                  
                                                                                       
                                                                                       
    /**                                                                                
     * 抽象的处理方法,传入需要处理的数据类                                                              
     *                                                                                 
     * @param data                                                                     
     */                                                                                
    public abstract void handler(RequestData data);                                    
                                                                                       
}                                                                                      
                                                                                       

3、具体处理实现


public class RequestDataHandlerA extends AbstractRequestDataHandler {


    @Override
    public void handler(RequestData data) {
        System.out.println("处理类A!");
        String message = data.getMessage().replace("A", "");
        data.setMessage(message);
        if (next != null) {
            next.handler(data);
        } else {
            System.out.println("终止执行");
        }
    }
}
public class RequestDataHandlerB extends AbstractRequestDataHandler {

    @Override
    public void handler(RequestData data) {
        System.out.println("处理类B!");
        String message = data.getMessage().replace("B", "");
        data.setMessage(message);
        if (next != null) {
            next.handler(data);
        } else {
            System.out.println("终止执行");
        }
    }
}

public class RequestDataHandlerC extends AbstractRequestDataHandler {

    @Override
    public void handler(RequestData data) {
        System.out.println("处理类C!");
        String message = data.getMessage().replace("C", "");
        data.setMessage(message);
        if (next != null) {
            next.handler(data);
        } else {
            System.out.println("终止执行");
        }
    }
}

4、客户端

public class ChainResponsibilityClient {

    public static void main(String[] args) {
        AbstractRequestDataHandler handler1 = new RequestDataHandlerA();
        AbstractRequestDataHandler handler2 = new RequestDataHandlerB();
        AbstractRequestDataHandler handler3 = new RequestDataHandlerC();

        //生成调用链条
        handler1.setNext(handler2);
        handler2.setNext(handler3);

        //把数据交给handler1处理即可,不需要关心h2和h3怎么处理的
        RequestData requestData = new RequestData();
        requestData.setMessage("ABCDE");
        handler1.handler(requestData);

        System.out.println(requestData.getMessage());
    }
}

四、责任链模式需要注意的地方

1、循环调用,比如下列代码会造成循环调用:

  //生成调用链条
        handler1.setNext(handler2);
        handler2.setNext(handler3);
        handler3.setNext(handler1);

2、链条太长可能会导致的性能问题

3、责任链的顶端和低端节点之间不应该存在耦合问题


http://www.kler.cn/a/535880.html

相关文章:

  • [ESP32:Vscode+PlatformIO]添加第三方库 开源库 与Arduino导入第三方库的区别
  • Llama最新开源大模型Llama3.1
  • ZK-ALU-在有限域上实现左移
  • 51单片机07 串口通信
  • Spring AI + Ollama 实现 DeepSeek-R1 API 服务和调用
  • C++中命名空间(namespace)
  • 深度学习里面的而优化函数 Adam,SGD,动量法,AdaGrad 等 | PyTorch 深度学习实战
  • HbuilderX中,实现Gzip的两种方法
  • 【数据结构-Trie树】力扣720. 词典中最长的单词
  • android 打包AAR-引入资源layout-安卓封包
  • 网络计算机的五个组成部分
  • 2.5-数据结构:AVL树
  • DeepSeek 开源模型全解析(2024.1.1–2025.2.6)
  • 2025年2月6日(anaconda cuda 学习 基本命令)
  • 《ISO/SAE 21434-2021 道路汽车--网络安全工程》标准解读
  • 大模型的底层逻辑及Transformer架构
  • multisim入门学习设计电路
  • react18新增了哪些特性
  • ASP.NET Core中Filter与Middleware的区别
  • C++_数据结构_AVL树
  • mysql 数据导出到文件
  • Android 单例模式:实现可复用数据存储
  • java解析复杂json
  • maven不能导入依赖和插件Cannot resolve plugin org.apache.maven.plugins:maven-xxx
  • Linux网络配置(超详细)
  • 【声音转文字CapsWriter】声音随时转化为文字,CapsWriter提高工作效率