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

server/2025/1/23 8:14:19/

设计模式】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

关键代码
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.ppmy.cn/server/160680.html

相关文章

Powershell语言的云计算

PowerShell与云计算&#xff1a;新时代的自动化管理工具 在当今快速发展的信息技术时代&#xff0c;云计算已经成为企业和个人计算资源的主要选择。随着云服务的普及&#xff0c;如何高效地管理和自动化云环境中的资源&#xff0c;成为了IT管理员和开发者们面临的重要挑战。Po…

mq_open创建队列失败

mq_open创建队列失败 Error creating message queue: Invalid argument 问题&#xff1a;linux中mq_open创建队列失败&#xff0c;提示该问题&#xff0c;怎么解决 原因&#xff1a;队列名&#xff08;name&#xff09;问题&#xff1a; 1&#xff09;POSIX消息队列名必须以…

Python 轻松扫描,快速检测:高效IP网段扫描工具全解析

Python 轻松扫描&#xff0c;快速检测&#xff1a;高效IP网段扫描工具全解析 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着…

Hadoop•搭建完全分布式集群

听说这里是目录哦 一、安装Hadoop&#x1f955;二、配置Hadoop系统环境变量&#x1f96e;三、验证Hadoop系统环境变量是否配置成功&#x1f9c1;四、修改Hadoop配置文件&#x1f36d;五、分发Hadoop安装目录&#x1f9cb;六、分发系统环境变量文件&#x1f368;七、格式化HDFS文…

Threejs的学习-常用的API

为了方便自己后期查询方便&#xff0c;这里做个记录记录使用过的Threejs的对象&#xff0c;后续慢慢更新&#xff0c;如果觉得有用的话别忘了收藏下 渲染器 WebGLRenderer 负责将3D场景渲染到HTML元素&#xff08;通常是<canvas>&#xff09;上 常用的参数&#xff1…

机器学习练习day1

使用scikit-learn中的KNN包实现对鸢尾花数据集或者自定义数据集的的预测 KNN算法有三要素&#xff1a;1.K值选择&#xff1b;2.距离选择&#xff1b;3.分类规则选择。 步骤1 导入数据集 步骤2 将数据集设置标签 步骤3 设置超参数 代码 from sklearn.neighbors import KNei…

信号失真度测试仪、音频失真度测试仪、失真度仪、全自动数字失真度测量仪

谐波失真是由放大器的非线性引起的&#xff0c;失真的结果是使放大器输出产生了原信号中没有的谐波分量&#xff0c;使声音失去了原有的音色&#xff0c;严重时声音会发破、刺耳。多媒体音箱的谐波失真在标称额定功率时的失真度均为10%&#xff0c;要求较高的一般应该在1%以下。…

Vue 3 的 keep-alive 及生命周期钩子

在 Vue 3 中&#xff0c;keep-alive 是一个内置组件&#xff0c;用于提高性能和减少不必要的组件销毁与重建。它与组件的生命周期紧密相关&#xff0c;特别是在动态组件和路由切换场景下&#xff0c;能够缓存组件的状态并避免重新渲染。 而 onActivated 和 onDeactivated 是 …