【设计模式】JAVA 策略 工厂 模式 彻底告别switch if 等

【设计模式】JAVA 策略 工厂 模式 彻底告别switch if 等

目录

【设计模式】JAVA 策略 工厂 模式 彻底告别switch if 等

 优势

 适用场景

项目结构

关键代码


 优势

  • 消除 switch:将分支逻辑分散到独立的策略类中。

  • 开闭原则:新增类型只需添加新的 TypeHandler 实现类,无需修改已有代码。

  • 依赖注入:由 Spring 管理 Bean 生命周期,天然支持单例、原型等作用域。

  • 易于测试:每个策略类可单独测试,工厂类可通过 Mock 注入。

 适用场景

  • 类型数量庞大(如上百种)。

  • 不同类型的处理逻辑独立且可能频繁变更。

  • 需要动态扩展支持新类型。

项目结构
src/main/java
├── com.example.demo
│   ├── handler
│   │   ├── TypeHandler.java
│   │   ├── TypeAHandler.java
│   │   ├── TypeBHandler.java
│   │   └── DefaultHandler.java
│   ├── factory
│   │   └── TypeHandlerFactory.java
│   └── service
│       └── BusinessService.java

关键代码
// TypeHandler.java
public interface TypeHandler {void handle();String getType();
}// TypeAHandler.java
@Component
public class TypeAHandler implements TypeHandler {@Overridepublic void handle() { System.out.println("处理类型A"); }@Overridepublic String getType() { return "A"; }
}// TypeHandlerFactory.java
@Component
public class TypeHandlerFactory {private final Map<String, TypeHandler> handlerMap;@Autowiredpublic TypeHandlerFactory(List<TypeHandler> handlers) {handlerMap = handlers.stream().collect(Collectors.toMap(TypeHandler::getType, handler -> handler));}public TypeHandler getHandler(String type) {return Optional.ofNullable(handlerMap.get(type)).orElseThrow(() -> new IllegalArgumentException("未知类型: " + type));}
}// BusinessService.java
@Service
public class BusinessService {private final TypeHandlerFactory handlerFactory;@Autowiredpublic BusinessService(TypeHandlerFactory handlerFactory) {this.handlerFactory = handlerFactory;}public void process(String type) {handlerFactory.getHandler(type).handle();}
}

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

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

相关文章

使用ffmpeg提高mp4压缩比,减小文件体积【windows+ffmpeg+batch脚本】

文章目录 关于前情提要FFmpeg是什么使用脚本运行FFmpeg首先&#xff0c;下载ffmpeg.exe然后在视频相同位置写一个bat脚本运行压缩脚本 关于 个人博客&#xff0c;里面偶尔更新&#xff0c;最近比较忙。发一些总结的帖子和思考。 江湖有缘相见&#x1f91d;。如果读者想和我交…

# [Unity] [游戏开发]基础协程应用与实现详解

协程(Coroutine)是Unity中一种用于处理复杂定时逻辑的非常有用的工具。通过协程,可以轻松地在多个帧之间分步执行任务,而不阻塞主线程。本文将介绍如何在Unity中使用协程,并通过简单的实例展示协程的基本应用。 1. 协程的基础概念 在Unity中,协程是通过IEnumerator函数…

Kivy App开发之UX控件Bubble气泡

kivy提供了一个提示气泡的小控件Bubble,使用时可以指定气泡箭头的方向以及显示的图像,还可以作为容器添加其他小控件。 常用属性如下 属性说明orientation气泡内子项的排序方式,可设置为vertical或horizontal,默认horizontalarrow_pos箭头相对于气泡的位置,可设置为left_…

Vue3初学之Element Plus Dialog对话框,Message组件,MessageBox组件

Dialog的使用&#xff1a; 控制弹窗的显示和隐藏 <template><div><el-button click"dialogVisible true">打开弹窗</el-button><el-dialogv-model"dialogVisible"title"提示"width"30%":before-close&qu…

某大厂一面:Java 构造器是否可以被重写

在 Java 中&#xff0c;构造器&#xff08;Constructor&#xff09;不能被重写&#xff08;Override&#xff09;。这是因为构造器是用于创建对象并初始化对象状态的特殊方法&#xff0c;它与类的实例化过程紧密相关。以下是对这一问题的详细解释&#xff1a; 1. 构造器的特点 …

自然语言处理(NLP)-总览图学习

文章目录 自然语言处理&#xff08;NLP&#xff09;-总览图学习1.一张总览图的学习1. 语音学&#xff08;Phonology&#xff09;2. 形态学&#xff08;Morphology&#xff09;3. 句法学&#xff08;Syntax&#xff09;4. 语义学&#xff08;Semantics&#xff09;5. 推理&#…

机器学习 vs 深度学习

目录 一、机器学习 1、实现原理 2、实施方法 二、深度学习 1、与机器学习的联系与区别 2、神经网络的历史发展 3、神经网络的基本概念 一、机器学习 1、实现原理 训练&#xff08;归纳&#xff09;和预测&#xff08;演绎&#xff09; 归纳: 从具体案例中抽象一般规律…

谈谈RTMP|RTSP播放器视频view垂直|水平反转和旋转设计

技术背景 我们在做RTMP|RTSP播放器的时候&#xff0c;有这样的技术诉求&#xff0c;有的摄像头出来的数据是有角度偏差的&#xff0c;比如“装倒了”&#xff0c;或者&#xff0c;图像存在上下或者左右反转&#xff0c;这时候&#xff0c;就需要播放器能做响应的处理&#xff…

centos 安全配置基线

CentOS 是一个广泛使用的操作系统&#xff0c;为了确保系统的安全性&#xff0c;需要遵循一系列的安全基线。以下是详细的 CentOS 安全基线配置建议&#xff1a; 通过配置核查,CentOS操作系统未安装入侵防护软件,无法检测到对重要节点进行入侵的 解决方案&#xff1a; 安装入侵…

论文阅读--Qwen22.5技术报告

Qwen2 1 引言 所有模型都是在超过7 trillion token&#xff08;7万亿&#xff09;的高质量、大规模数据集上预训练的 2 Tokenizer & Model 2.1 Tokenizer 沿用Qwen&#xff08;Bai等人&#xff0c;2023a&#xff09;的做法&#xff0c;我们采用了基于字节级字节对编码…

网络安全等级保护基本要求——等保二级

《信息安全技术网络安全等级保护基本要求》GB/T22239-2019 7.1 安全通用要求 7.1.1 安全物理环境 7.1.1.1 物理位置选择 本项要求包括&#xff1a; a) 机房场地应选择在具有防震、防风和防雨等能力的建筑内;b) 机房场地应避免设在建筑物的顶层或地下室&#xff0c;否则应加…

FPGA中场战事

2023年10月3日,英特尔宣布由桑德拉里维拉(Sandra Rivera)担任“分拆”后独立运营的可编程事业部首席执行官。 从数据中心和人工智能(DCAI)部门总经理,转身为执掌该业务的CEO,对她取得像AMD掌门人苏姿丰博士类似的成功,无疑抱以厚望。 十年前,英特尔花费167亿美元真金白银…

【jmeter】下载及使用教程【mac】

1.安装java 打开 Java 官方下载网站https://www.oracle.com/java/technologies/downloads/选择您想要下载的 Java 版本&#xff0c;下载以 .dmg 结尾的安装包&#xff0c;注意 JMeter 需要 Java 8下载后打开安装包点击“安装”按钮即可 2.下载jmeter 打开 Apache JMeter 官方…

Nginx HTTP 服务器基础配置

一、Nginx 初相识 在当今互联网的广阔世界里&#xff0c;Nginx作为一款高性能的HTTP和反向代理服务器&#xff0c;犹如一颗璀璨的明星&#xff0c;闪耀在Web服务器领域的天空中。它诞生于2004年&#xff0c;由俄罗斯的Igor Sysoev开发&#xff0c;最初的目的是为了解决C10K问题…

postman请求参数化

postman界面介绍 一、使用环境变量(Environment Variables)进行参数化 1、在请求中使用环境变量 在请求的url、请求头(Headers)、请求体(Body)等部分都可以使用环境变量。 URL 部分示例 点击 Postman 界面右上角的 “眼睛” 图标(Environment Quick Look)打开环境管理…

2024年博客之星年度评选|第一步——创作影响力评审入围Top300名单 | 博客之星陪跑指南

2024年博客之星年度评选&#xff5c;第一步——创作影响力评审入围Top300名单 | 博客之星陪跑指南 2024年博客之星年度评选正在如火如荼地进行中&#xff01;作为博客圈最具影响力的评选活动之一&#xff0c;今年的评选吸引了众多优秀博主的参与。现在&#xff0c;距离Top300入…

WPF 复杂页面布局及漂亮 UI 界面设计全解析

在 WPF 开发领域&#xff0c;打造一个既具备复杂功能又拥有美观 UI 界面的应用程序是众多开发者追求的目标。复杂页面布局与漂亮的 UI 设计不仅能提升用户体验&#xff0c;还能展现应用的专业性和独特性。本文将深入探讨如何在 WPF 中实现复杂页面布局以及设计出令人眼前一亮的…

CentOS 7乱码问题如何解决?

1.使用超级用户操作: sudo su2.修改i18n配置文件&#xff1a; vi /etc/sysconfig/i18n将文件修改或添加为以下内容&#xff1a; LANG"zh_CN.UTF8" LC_ALL"zh_CN.UTF8"保存并退出&#xff08;按Esc键&#xff0c;输入:wq&#xff0c;然后回车&#xff09…

阻燃高温尼龙行业:市场潜力巨大,引领材料科学新变革

在当今快速发展的工业和材料科学领域&#xff0c;阻燃高温尼龙作为一种兼具卓越防火性能和高温稳定性的新型材料&#xff0c;正逐步成为多个领域的首选材料。随着全球对安全性能要求的提高和技术的不断创新&#xff0c;阻燃高温尼龙市场呈现出快速增长的态势&#xff0c;展现出…

HTML中的`<!DOCTYPE html>`是什么意思?

诸神缄默不语-个人CSDN博文目录 在学习HTML时&#xff0c;我们经常会看到HTML文档的开头出现<!DOCTYPE html>&#xff0c;它是HTML文件的第一行。很多初学者可能会疑惑&#xff0c;为什么需要这行代码&#xff1f;它到底有什么作用呢&#xff1f;在这篇文章中&#xff0…