责任链模式简单实现
两种实现方式
第一种
public interface IBaseTask {public void doAction(String isTask,IBaseTask iBaseTask);
}
public class ChainManager implements IBaseTask{//工作类的集合private List<IBaseTask> iBaseTaskList = new ArrayList<>();public void addTask(IBaseTask iBaseTask){iBaseTaskList.add(iBaseTask);}//下标private int index = 0;@Overridepublic void doAction(String isTask, IBaseTask iBaseTask) {if(iBaseTaskList.isEmpty()){};if (index >= iBaseTaskList.size()){return;}//获取对应下标的任务对象IBaseTask baseTask = iBaseTaskList.get(index);index ++;//执行任务baseTask.doAction(isTask,iBaseTask);}
}
//创建三个责任链对象
public class TaskOne implements IBaseTask{@Overridepublic void doAction(String isTask, IBaseTask iBaseTask) {if ("1".equals(isTask)) {System.out.println("拦截器1处理了");}else{iBaseTask.doAction(isTask,iBaseTask);}}
}
public class TaskTwo implements IBaseTask{@Overridepublic void doAction(String isTask, IBaseTask iBaseTask) {if ("2".equals(isTask)) {System.out.println("拦截器2处理了");}else{iBaseTask.doAction(isTask,iBaseTask);}}
}
public class TaskThree implements IBaseTask{@Overridepublic void doAction(String isTask, IBaseTask iBaseTask) {if ("3".equals(isTask)) {System.out.println("拦截器3处理了");}else{iBaseTask.doAction(isTask,iBaseTask);}}
}
执行
private void zerenlian1() {ChainManager chainManager = new ChainManager();chainManager.addTask(new TaskOne());chainManager.addTask(new TaskTwo());chainManager.addTask(new TaskThree());//从TaskOne开始执行不对的话就自动执行TaskTwochainManager.doAction("2",chainManager);//返回结果 "拦截器2处理了"}
第二种
public abstract class BaseTask {private boolean isTask;public BaseTask(boolean isTask) {this.isTask = isTask;}private BaseTask nextTask;public void addTask(BaseTask nextTask){this.nextTask = nextTask;}public abstract void doAction();public void action(){if(isTask){doAction();}else{if(nextTask != null){nextTask.action();}}}
}
public class Task1 extends BaseTask{public Task1(boolean isTask) {super(isTask);}@Overridepublic void doAction() {System.out.println("节点1已被执行");}
}
private void zerenlian() {Task1 task1 = new Task1(false);Task2 task2 = new Task2(false);Task3 task3 = new Task3(true);task1.addTask(task2);task2.addTask(task3);task1.action();}
相关文章:
责任链模式简单实现
两种实现方式 第一种 public interface IBaseTask {public void doAction(String isTask,IBaseTask iBaseTask); }public class ChainManager implements IBaseTask{//工作类的集合private List<IBaseTask> iBaseTaskList new ArrayList<>();public void addTas…...
Excel自动化办公——Openpyxl的基本使用
Excel自动化办公——Openpyxl的基本使用 个人感觉,相比Pandas,openpyxl对Excel的操作更为细致,Pandas则更适用于统计计算; 01 基本环境02 Excel数据读取操作03 案例04 向Excel写入数据05 表数据定向修改06 单元格样式制定07 单元…...
解决Fastjson2 oom(Out Of Memory),支持大对象(LargeObject 1G)json操作
在使用Fastjson中的 JSON.toJSONString时,如果对象数据太大(>64M)会出现Out Of Memory,查看源码发现为JSONWriter中的判断代码 其中maxArraySize默认最大为64M,如果超过了就会抛出oom错误 如果fastjson过多的使用内存,也可能导致java堆内存溢出,所以这…...
SpringBoot + redis处理购物车逻辑
1、pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 2、application.xml spring: characterEncodingutf-8&useSSLfalseredis:host: 127.0.…...
open cv学习 (五) 图像的阈值处理
图像的阈值处理 demo1 # 二值化处理黑白渐变图 import cv2 img cv2.imread("./img.png", 0) # 二值化处理 t1, dst cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) cv2.imshow("img", img) cv2.imshow("dst", dst) cv2.waitKey() cv2.des…...
NVIDIA vGPU License许可服务器高可用全套部署秘籍
第1章 前言 近期遇到比较多的场景使用vGPU,比如Citrix 3D场景、Horizon 3D场景,还有AI等,都需要使用显卡设计研发等,此时许可服务器尤为重要,许可断掉会出现掉帧等情况,我们此次教大家部署HA许可服务器。 …...
基于CNN卷积神经网络的口罩检测识别系统matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................ % 循环处理每张输入图像 for…...
《HeadFirst设计模式(第二版)》第九章代码——迭代器模式
情景: 一家早餐店和一家午餐点准备合并在一起,两家的点菜的菜单实现方式如下: 首先,他们的菜单选项都基于同一个类: 菜单选项类 package Chapter9_IteratorPattern.Origin;/*** Author 竹心* Date 2023/8/17**/public class Men…...
Electron入门,项目启动。
electron 简单介绍: 实现:HTML/CSS/JS桌面程序,搭建跨平台桌面应用。 electron 官方文档: [https://electronjs.org/docs] 本文是基于以下2篇文章且自行实践过的,可行性真实有效。 文章1: https://www.cnbl…...
深入理解索引B+树的基本原理
目录 1. 引言 2. 为什么要使用索引? 3. 索引的概述 4. 索引的优点是什么? 4.1 降低数据库的IO成本,提高数据查找效率 4.2 保证数据库每一行数据的唯一性 4.3 加速表与表之间的连接 4.4 减少查询中分组与排序的执行时间 5. 索引的缺点…...
vue3 简易用对话框实现点击头像放大查看
设置头像悬停手势 img:hover{cursor: pointer;}效果: 编写对话框 <el-dialog class"bigAvatar"style"border-radius: 4px;"v-model"deleteDialogVisible"title"查看头像"top"5px"><div><img src&…...
opencv 矩阵运算
1.矩阵乘(*) Mat mat1 Mat::ones(2,3,CV_32FC1);Mat mat2 Mat::ones(3,2,CV_32FC1);Mat mat3 mat1 * mat2; //矩阵乘 结果 2.元素乘法或者除法(mul) Mat m Mat::ones(2, 3, CV_32FC1);m.at<float>(0, 1) 3;m.at…...
第四章 字符串part01
344.反转字符串 public void reverseString(char[] s) {int len s.length;int left 0;int right len-1;while (left < right){char tmp s[right];s[right] s[left];s[left] tmp;left;right--;} }反转字符串II 注意String不可变,因此可使用char数组或者St…...
Python3内置函数大全
吐血整理 Python3内置函数大全 1.abs()函数2.all()函数3.any()函数4.ascii()函数5.bin()函数6.bool()函数7.bytes()函数8.challable()函数9.chr()函数10.classmethod()函数11.complex()函数12.complie()函数13.delattr()函数14.dict()函数15.dir()函数16.divmod()函数17.enumer…...
什么是“新型基础设施”?建设重点是什么?
一是信息基础设施。主要是指基于新一代信息技术演化生成的基础设施,比如,以5G、物联网、工业互联网、卫星互联网为代表的通信网络基础设施,以人工智能、云计算、区块链等为代表的新技术基础设施,以数据中心、智能计算中心为代表的…...
混杂接口模式---vlan
策略在两个地方可以用--1、重发布 2、bgp邻居 2、二层可以干的,三层也可以干 3、未知单播:交换机的MAC地址表的记录保留时间是5分钟,电脑的ARP表的记录保留时间是2小时 4、route recursive-lookup tunnel 华为默认对于bgp学习来的路由不开启标…...
Greenplum多级分区表添加分区报错ERROR: no partitions specified at depth 2
一般来说,我们二级分区表都会使用模版,如果没有使用模版特性,那么就会报ERROR: no partitions specified at depth 2类似的错误。因为没有模版,必须要显式指定分区。 当然我们在建表的时候,如果没有指定,那…...
EV PV AC SPI CPI TCPI
SPI EV / PV CPI EV / ACCPI 1.25 SPI 0.8 PV 10 000 BAC 100 000EV PV * SPI 10 000 * 0.8 8000 AC EV / CPI 8000 / 1.25 6400TCPI (BAC - EV) / (BAC -AC) (100 000 - 8 000) / (100 000 - 6 400) 92 000 / 93 600 0.98290598...
【电商领域】Axure在线购物商城小程序原型图,品牌自营垂直电商APP原型
作品概况 页面数量:共 60 页 兼容软件:Axure RP 9/10,不支持低版本 应用领域:网上商城、品牌自营商城、商城模块插件 作品申明:页面内容仅用于功能演示,无实际功能 作品特色 本作品为品牌自营网上商城…...
Cpp基础Ⅰ之编译、链接
1 C是如何工作的 工具:Visual Studio 1.1 预处理语句 在.cpp源文件中,所有#字符开头的语句为预处理语句 例如在下面的 Hello World 程序中 #include<iostream>int main() {std::cout <"Hello World!"<std::endl;std::cin.get…...
百川2-13B-4bits量化版精度测试:OpenClaw自动化任务准确率对比
百川2-13B-4bits量化版精度测试:OpenClaw自动化任务准确率对比 1. 测试背景与实验设计 上周在部署OpenClaw自动化工作流时,我遇到了一个现实问题:本地显卡只有12GB显存,跑不动原版13B模型。于是尝试了百川2-13B的4bits量化版本&…...
视觉语言模型VLM高效部署:基于TensorRT-LLM的C++推理实践
1. 视觉语言模型VLM与TensorRT-LLM的黄金组合 视觉语言模型(VLM)这两年真是火得不行,它能让AI同时理解图片和文字,像人类一样看图说话。但实际部署时,很多团队都会遇到性能瓶颈——特别是用Python直接推理时࿰…...
别再死记硬背了!用Python脚本+Modbus Poll工具,5分钟搞懂Modbus功能码怎么用
用PythonModbus Poll实战:5分钟解锁功能码核心逻辑 第一次接触Modbus协议时,那些晦涩的功能码总让我头疼——01H、03H、05H这些十六进制代码就像天书,文档里的理论描述看完就忘。直到我发现用Python脚本配合Modbus Poll工具进行实操测试&…...
别再被ToggleGroup坑了!手把手教你写一个不自动选首项的CustomToggleGroup组件(附完整代码)
深度定制Unity ToggleGroup:打造无默认选中行为的智能组件 引言 在Unity UI开发中,ToggleGroup组件是构建选项卡式界面的常见选择,但许多开发者都遇到过这样的困扰:当ToggleGroup激活时,系统总会自动选中第一个Toggle项…...
让老Mac重获新生的魔法:OpenCore Legacy Patcher如何持续守护你的设备
让老Mac重获新生的魔法:OpenCore Legacy Patcher如何持续守护你的设备 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否曾为那台陪伴多年的Mac设备感到惋…...
基于背景减除的PIV颗粒图像时均灰度分布分析方法
基于背景减除的PIV颗粒图像时均灰度分布分析方法 摘要 粒子图像测速(PIV)技术广泛应用于流体力学实验研究,其原始图像中包含大量示踪颗粒的灰度信息。除了用于速度场计算外,颗粒灰度分布还可用于分析颗粒浓度、粒径分布及混合特性。本文提出了一套完整的图像处理流程,包…...
从零上手Neo4j Desktop:CSV数据导入与核心Cypher操作指南
1. Neo4j Desktop环境准备与数据导入 第一次打开Neo4j Desktop时可能会被它的界面搞得有点懵,别担心,我刚开始用的时候也这样。这个工具把数据库管理、浏览器界面和插件都集成在了一起,特别适合新手快速上手。安装过程我就不赘述了࿰…...
UniApp多主题开发避坑指南:为什么SCSS+Require比Vuex方案更优雅?
UniApp多主题开发实战:SCSS动态加载方案深度解析与性能优化 在移动应用开发领域,主题切换功能已成为提升用户体验的重要环节。UniApp作为跨平台开发框架,如何实现高效、灵活的主题管理一直是开发者关注的焦点。本文将深入探讨基于SCSS变量与动…...
若依框架单点登录!!!
一、不分离版在application.yml设置maxSession为1即可。修改shiro的配置shiro:session:# 同一个用户最大会话数,比如2的意思是同一个账号允许最多同时两个人登录(默认-1不限制)maxSession: 1# 踢出之前登录的/之后登录的用户,默认…...
Qwen3.5-4B-Claude推理模型在算法面试辅导中的实战:分步推导+代码示例生成
Qwen3.5-4B-Claude推理模型在算法面试辅导中的实战:分步推导代码示例生成 1. 模型介绍与核心能力 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是一个专门针对推理任务优化的AI模型,它基于Qwen3.5-4B架构,通过蒸馏训练强化了结构化…...
