责任链模式(Chain Responsibility)

devtools/2025/2/8 1:22:55/

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

二、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;}@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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.ppmy.cn/devtools/156985.html

相关文章

在C#中,Array,List,ArrayList,Dictionary,Hashtable,SortList,Stack的区别

Array Array你可以理解为是所有数组的大哥 普通数组 : 特点是长度固定, 只能存储相同类型的数据 static void Main(string[] args){//声明int[] ints;string[] strings;People[] peoples;//默认值 //int 类型是 0//string 类型是 nullint[] ints1 { 1, 2, 3 };string[] …

Chapter2 Amplifiers, Source followers Cascodes

Chapter2 Amplifiers, Source followers & Cascodes MOS单管根据输入输出, 可分为CS放大器, source follower和cascode 三种结构. Single-transistor amplifiers 这一章学习模拟电路基本单元-单管放大器 单管运放由Common-Source加上DC电流源组成. Avgm*Rds, gm和rds和…

鼠标拖尾特效

文章目录 鼠标拖尾特效一、引言二、实现原理1、监听鼠标移动事件2、生成拖尾元素3、控制元素生命周期 三、代码实现四、使用示例五、总结 鼠标拖尾特效 一、引言 鼠标拖尾特效是一种非常酷炫的前端交互效果,能够为网页增添独特的视觉体验。它通常通过JavaScript和C…

【数据采集】基于Selenium采集豆瓣电影Top250的详细数据

基于Selenium采集豆瓣电影Top250的详细数据 Selenium官网:https://www.selenium.dev/blog/ 豆瓣电影Top250官网:https://movie.douban.com/top250 写在前面 实验目标:基于Selenium框架采集豆瓣电影Top250的详细数据。 电脑系统:Windows 使用软件:PyCharm、Navicat 技术需求…

C# OpenCV机器视觉:利用TrashNet实现垃圾分类

在繁华的都市里,垃圾分类成了让人头疼的难题。阿强住在一个老旧小区,每天扔垃圾的时候,他都要对着垃圾桶纠结半天:“这到底是可回收物,还是有害垃圾啊?要是分错了,会不会被罚款?” 阿…

MySQL——表操作及查询

一.表操作 MySQL的操作中,一些专用的词无论是大写还是小写都是可以通过的。 1.插入数据 INSERT [INTO] table_name (列名称…)VALUES (列数据…), (列数据…); "[]"表示可有可无,插入时,如果不指定要插入的列,则表示默…

HTTP和HTTPS协议详解

HTTP和HTTPS协议详解 HTTP详解什么是http协议http协议的发展史http0.9http1.0http1.1http2.0 http协议的格式URI和URL请求request响应response http协议完整的请求与响应流程 HTTPS详解为什么使用HTTPSSSL协议HTTPS通信过程TLS协议 HTTP详解 什么是http协议 1、全称Hyper Tex…

iOS 音频录制、播放与格式转换

iOS 音频录制、播放与格式转换:基于 AVFoundation 和 FFmpegKit 的实现 在 iOS 开发中,音频处理是一个非常常见的需求,比如录音、播放音频、音频格式转换等。本文将详细解读一段基于 AVFoundation 和 FFmpegKit 的代码,展示如何实现音频录制、播放以及 PCM 和 AAC 格式之间…