【设计模式】责任链+模板+工程模式使用模板

前言

方便写出优雅,解耦,高内聚,高复用的代码。

Demo

// 1. 定义验证器接口(责任链模式)
public interface Validator {Validator setNext(Validator next);boolean validate(Data data);
}// 2. 创建抽象验证器(模板方法模式)
public abstract class AbstractValidator implements Validator {protected Validator next;@Overridepublic Validator setNext(Validator next) {this.next = next;return next;}@Overridepublic boolean validate(Data data) {// 模板方法定义验证流程boolean result = doValidate(data);// 如果当前验证通过且有下一个验证器,继续验证if (result && next != null) {return next.validate(data);}return result;}// 子类实现具体验证逻辑protected abstract boolean doValidate(Data data);
}// 3. 实现具体验证器
public class FormatValidator extends AbstractValidator {@Overrideprotected boolean doValidate(Data data) {return data != null && data.getFormat().equals("valid");}
}public class RangeValidator extends AbstractValidator {@Overrideprotected boolean doValidate(Data data) {return data.getValue() > 0 && data.getValue() < 100;}
}// 4. 创建验证器工厂(工厂模式)
public class ValidatorFactory {public static Validator createValidatorChain() {Validator formatValidator = new FormatValidator();Validator rangeValidator = new RangeValidator();// 构建验证器链formatValidator.setNext(rangeValidator);return formatValidator;}
}// 5. 客户端使用
Validator validator = ValidatorFactory.createValidatorChain();
boolean isValid = validator.validate(new Data("valid", 50));

三、解析

  • 这里的工厂设计模式主要用来构建责任链是怎么链的。和策略+工厂模式有所不同,策略+工厂模式的工程模式是为了根据一个 Code 获取哪个策略。

  • 结合模板设计模式主要是为了干掉重复的代码,每个单独的子类可能有很多公共的代码,这时候增加模板设计模式就会优雅很多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/906609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能体应用如何重塑未来生活?全面解析技术场景与实在Agent突破

智能体应用有哪些&#xff1f;在科技飞速发展的当下&#xff0c;人工智能正以前所未有的速度渗透到我们生活的方方面面。而智能体技术&#xff0c;作为人工智能领域的一颗璀璨新星&#xff0c;正逐渐展现出其重塑未来生活的巨大潜力。从办公效率的提升到医疗服务的优化&#xf…

【2025-05-22】XXL-JOB 的 8810 端口添加到 CentOS 6.5 的防火墙白名单

要将 XXL-JOB 的 8810 端口添加到 CentOS 6.5 的防火墙白名单中&#xff0c;需修改 iptables 规则。以下是具体步骤&#xff1a; 1. 编辑防火墙配置文件 vi /etc/sysconfig/iptables2. 添加 XXL-JOB 端口规则 在 INPUT 链的 ACCEPT 规则部分&#xff08;例如在开放 80/443 端…

【大前端】使用NodeJs HTTP模块创建web服务器、SSE通讯

Nodejs构建web服务器有很多中方式&#xff0c;常见的有两种&#xff1a;express&#xff0c;http.Server&#xff1a; express&#xff1a;轻量级的Nodejs web服务器&#xff0c;功能完善&#xff0c;支持自定义插件http.Server&#xff1a;NodeJ内置模块&#xff0c;比expres…

Python 响应报文提取方式

简介 响应报文分为JSON格式和字符串格式&#xff0c;往往响应报文中有很多个字段和多层嵌套&#xff0c;如何快速的提取字段key和对应的value值呢&#xff1f;有三种提取方式&#xff1a;jsonpath提取、正则表达式、字符串切片。jsonpath是针对JSON格式的数据提取&#xff0c;…

《大模型开源与闭源的深度博弈:科技新生态下的权衡与抉择》

开源智能体大模型的核心魅力&#xff0c;在于它构建起了一个全球开发者共同参与的超级协作网络。想象一下&#xff0c;来自世界各个角落的开发者、研究者&#xff0c;无论身处繁华都市还是偏远小镇&#xff0c;只要心怀对技术的热爱与追求&#xff0c;就能加入到这场技术狂欢中…

【每日一题丨2025年5.12~5.18】排序相关题

个人主页&#xff1a;Guiat 归属专栏&#xff1a;每日一题 文章目录 1. 【5.12】P1068 [NOIP 2009 普及组] 分数线划定2. 【5.13】P5143 攀爬者3. 【5.14】P12366 [蓝桥杯 2022 省 Python B] 数位排序4. 【5.15】P10901 [蓝桥杯 2024 省 C] 封闭图形个数5.【5.16】P12165 [蓝桥…

522UART是什么

UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发传输器&#xff09;是一种常见的串行通信协议&#xff0c;用于设备间的低速数据传输。它采用异步通信方式&#xff0c;无需时钟信号同步&#xff0c;仅需两根数据线&#xff08;TX发送、R…

养生攻略:五步打造健康生活

一、饮食&#xff1a;均衡膳食&#xff0c;轻养为先 遵循 “4321 饮食法则”&#xff1a;每餐 4 拳蔬菜、3 拳主食&#xff08;杂粮占 1/2&#xff09;、2 拳蛋白质、1 勺健康脂肪。早餐推荐菠菜鸡蛋卷饼配无糖豆浆&#xff0c;午餐选择糙米饭、清蒸鲈鱼、蒜蓉西兰花&#xff…

Ubuntu+Docker+内网穿透:保姆级教程实现安卓开发环境远程部署

文章目录 前言1. 虚拟化环境检查2. Android 模拟器部署3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问小结 6. 固定Cpolar公网地址7. 固定地址访问 前言 本文将详细介绍一种创新性的云开发架构&#xff1a;基于Ubuntu系统构建Android仿真容器环境&#xff0c;并集成安全隧道技…

第六届电子通讯与人工智能国际学术会议(ICECAI 2025)

在数字化浪潮中&#xff0c;电子通讯与人工智能的融合正悄然重塑世界的运行逻辑。技术基础的共生关系是这场变革的核心——电子通讯如同“信息高速公路”&#xff0c;通过5G等高速传输技术&#xff0c;将海量数据实时输送至AI系统&#xff0c;使其能够像人类神经系统般快速响应…

解决 Tailwind CSS 代码冗余问题

解决 Tailwind CSS 代码冗余问题 Tailwind CSS 确实可能导致 HTML 类名过长和冗余的问题&#xff0c;以下是几种有效的解决方案&#xff1a; 1. 使用 apply 指令提取重复样式 /* 在CSS文件中 */ .btn {apply px-4 py-2 rounded-md font-medium; }.card {apply p-6 bg-white …

pytorch-lightning1.7.0 old init 错误解决

在 /usr/local/anaconda3/envs/pcd117/lib/python3.9/site-packages/pytorch_lightning/utilities/data.py 500多行处修改下面这个方法 contextmanager def _replace_init_method(base_cls: Type, store_explicit_arg: Optional[str] None) -> Generator[None, None, No…

List介绍

什么是List 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法 Iterable也是一个接口&#xff0c;表示实现该接口的类是可以逐个元素进行遍历的&#xff0c;具体如下&#xff1…

STM32之模数转换器(ADC)

一、模数转换的原理与应用 一般在电子线路中&#xff0c;信号分为两种&#xff1a;模拟信号 数字信号&#xff0c;大多数传感器采集的都是模拟信号&#xff0c;比如温度、湿度、压力....... &#xff0c;传感器把采集的模拟信号转为数字信号&#xff0c;再转交给计算机进行处…

luckysheet的使用——17.将表格作为pdf下载到本地

luckysheet源码里面自带有打印按钮&#xff0c;但是功能是无法使用的&#xff0c;所以我把该功能重写了一遍 1.在menuButton.js文件中找到源码打印按钮的触发事件&#xff1a; $("#luckysheet-icon-print").click(function () {}2.使用自己写的挂载方法 window.pr…

云原生+大数据

虚拟化&#xff1a; 虚拟化&#xff0c;是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机&#xff0c;每个逻辑计算机可运行不同的操作系统&#xff0c;并且应用程序都可以在相互独立的空间内运行而互不影响&#xff0c;从而显著提…

微信小游戏流量主广告自动化浏览功能案例5

功能需求&#xff1a; 支持APP单行文本框输入1个小程序链接&#xff0c;在“文件传输助手”界面发送小程序链接并进入。 主要有“文章列表首页”和“文章内容”页面。每个页面支持点击弹窗广告、槽位广告、视频广告入口、视频广告内第三方广告。 弹窗广告、槽位广告、视频广…

线上 Linux 环境 MySQL 磁盘 IO 高负载深度排查与性能优化实战

目录 一、线上告警 二、问题诊断 1. 系统层面排查 2. 数据库层面分析 三、参数调优 1. sync_binlog 参数优化 2. innodb_flush_log_at_trx_commit 参数调整 四、其他优化建议 1. 日志文件位置调整 2. 生产环境核心参数配置模板 3. 突发 IO 高负载应急响应方案 五、…

【git进阶】git rebase(变基)

文章目录 合并分支提交信息修改合并提交记录时间问题1时间问题2时间问题3git rebase有很多用武之地,我一一道来 合并分支 当多人协作同一个分支时,在提交我们自己版本之前,我们会先用git pull获取远端最新的版本。但是 git pull = git fetch + git mergegit merge是一个非…

上位机知识篇---keil IDE操作

文章目录 前言文件操作按键新建打开保存保存所有编辑操作按键撤销恢复复制粘贴剪切全选查找书签操作按键添加书签跳转到上一个书签跳转到下一个书签清空所有书签编译操作按键编译当前文件构建目标文件重新构建调试操作按键进入调试模式复位全速运行停止运行单步调试逐行调试跳出…