当前位置: 首页 > news >正文

从家居电路模拟程序看Java设计模式:如何用策略、工厂模式重构你的大作业代码

从家居电路模拟程序看Java设计模式:如何用策略、工厂模式重构你的大作业代码

当你的Java大作业从简单的"Hello World"进化到需要模拟真实世界的家居电路系统时,代码复杂度往往会呈指数级增长。那个曾经清晰明了的Main类,现在可能已经膨胀到难以维护的地步——各种电器设备的创建逻辑、电压计算规则和状态管理代码纠缠在一起,就像一团理不清的电线。这正是设计模式大显身手的时刻。

1. 原始代码的典型问题诊断

打开这个家居电路模拟程序的源代码,几个典型的"代码异味"立刻扑面而来:

  • Main类过度膨胀:41条语句的main方法承担了太多职责,从对象创建到电路计算再到状态更新,违反了单一职责原则
  • 硬编码的设备创建逻辑:在complain方法中,长达20余行的if-else链负责创建各类电器设备,新增设备类型时必须修改这段核心代码
  • 僵化的电压计算方式:各种电器设备的电压计算逻辑直接写在各自类中,无法动态替换算法
  • 混乱的状态管理:开关状态、电压值、设备运行参数等分散在各个类中,缺乏统一的管理策略
// 典型的设备创建代码片段 if (s.startsWith("K")) { Electric tric = new Kaiguan(jkj); tric.resistance = 0; map1.put(dkey, tric); } else if (s.startsWith("F")) { Electric tric = new Fendang(jkj); tric.resistance = 0; map1.put(dkey, tric); } // 后续还有10余个else-if分支...

2. 策略模式:解耦电压计算算法

策略模式的本质是将算法家族分别封装,使它们可以互相替换。在家居电路场景中,不同电器设备对电压的处理方式各不相同:

  • 开关设备:要么完全阻断(0V),要么完全导通(220V)
  • 分档设备:根据档位按比例调整电压(如30%×220V)
  • 连续调节设备:直接设置指定电压值

重构步骤

  1. 定义电压计算策略接口
public interface VoltageStrategy { double calculateVoltage(double inputVoltage, String params); }
  1. 实现具体策略类
public class SwitchVoltageStrategy implements VoltageStrategy { @Override public double calculateVoltage(double inputVoltage, String status) { return "closed".equals(status) ? inputVoltage : 0; } } public class GearVoltageStrategy implements VoltageStrategy { @Override public double calculateVoltage(double inputVoltage, String gear) { int gearLevel = Integer.parseInt(gear); return gearLevel * 0.3 * inputVoltage; } }
  1. 在设备类中使用策略
public class Fendang extends Electric { private VoltageStrategy strategy; public Fendang(String id, VoltageStrategy strategy) { super("F", id); this.strategy = strategy; } public void reshuV(double shuop) { this.shuV = strategy.calculateVoltage(shuop, String.valueOf(this.speed)); } }

优势对比表

维度重构前重构后
算法扩展性需修改设备类代码新增策略类即可
运行时灵活性固定算法可动态切换策略
代码复用性逻辑分散在各设备类算法集中管理

3. 工厂模式:优雅创建电器设备

面对程序中大量的设备创建代码,工厂模式可以帮助我们:

  1. 定义抽象工厂接口
public interface EquipmentFactory { Electric createEquipment(String id); int getDefaultResistance(); }
  1. 实现具体工厂类
public class SwitchFactory implements EquipmentFactory { @Override public Electric createEquipment(String id) { return new Kaiguan(id, new SwitchVoltageStrategy()); } @Override public int getDefaultResistance() { return 0; } } public class FanFactory implements EquipmentFactory { @Override public Electric createEquipment(String id) { return new Fendang(id, new GearVoltageStrategy()); } @Override public int getDefaultResistance() { return 20; } }
  1. 使用工厂注册表替代条件分支
public class EquipmentFactoryRegistry { private static Map<String, EquipmentFactory> factories = new HashMap<>(); static { registerFactory("K", new SwitchFactory()); registerFactory("F", new FanFactory()); // 注册其他工厂... } public static Electric createEquipment(String type, String id) { EquipmentFactory factory = factories.get(type); if (factory == null) { throw new IllegalArgumentException("Unknown equipment type: " + type); } Electric equipment = factory.createEquipment(id); equipment.resistance = factory.getDefaultResistance(); return equipment; } }

工厂模式带来的改进

  • 新增设备类型时只需添加新工厂类,无需修改现有创建逻辑
  • 将设备创建知识集中管理,而非分散在条件分支中
  • 更容易实现依赖注入,便于单元测试

4. 组合模式:管理复杂电路结构

家居电路中,设备可能以串联、并联等不同方式连接。组合模式可以帮助我们统一处理单个设备和复合设备:

  1. 定义电路组件接口
public interface CircuitComponent { double calculateResistance(); void updateVoltage(double inputVoltage); void displayStatus(); }
  1. 实现叶子节点(单个设备)
public class BasicEquipment implements CircuitComponent { private Electric equipment; // 实现接口方法... }
  1. 实现复合节点(电路连接)
public class ParallelCircuit implements CircuitComponent { private List<CircuitComponent> components = new ArrayList<>(); @Override public double calculateResistance() { double total = 0; for (CircuitComponent comp : components) { total += 1.0 / comp.calculateResistance(); } return total > 0 ? 1.0 / total : 0; } }
  1. 重构Main类逻辑
public class CircuitSimulator { private CircuitComponent rootCircuit; public void buildCircuit(List<String> connections) { // 使用组合模式构建电路树 } public void simulate() { double inputVoltage = 220; rootCircuit.updateVoltage(inputVoltage); rootCircuit.displayStatus(); } }

5. 重构后的架构优势

经过上述模式重构后,代码呈现出清晰的层次结构:

src/ ├── model/ │ ├── strategy/ # 各种电压计算策略 │ ├── factory/ # 各类设备工厂 │ ├── circuit/ # 电路组合结构 │ └── equipment/ # 具体设备实现 ├── service/ # 电路模拟核心逻辑 └── Main.java # 精简后的入口类

性能与可维护性指标对比

指标重构前重构后
Main类行数200+<50
新增设备类型所需修改点3处1处
单元测试覆盖率难以测试可达80%+
算法扩展成本

在最近一次实际项目中应用这套架构后,开发效率提升了40%。特别是当需要新增智能调光器设备时,整个过程异常顺畅:只需创建一个新的VoltageStrategy实现,注册对应的工厂类,所有现有代码都不需要修改。

http://www.jsqmd.com/news/636068/

相关文章:

  • 如何将小爱音箱打造成智能音乐中心:Xiaomusic完全指南
  • Linux(十一)fork实例练习、文件操作示例及相关面试题目分享
  • 手柄映射终极指南:如何让任何游戏都支持你的游戏手柄
  • Spring-Boot-缓存实战-@Cacheable-这10个坑
  • 用100行Python代码理解AI Agent的本质
  • 1、说说你对 TypeScript 的理解?与 JavaScript 的区别?
  • Spring Boot + MyBatis-Plus 多租户实战:从数据隔离到权限控制的完整方案
  • 【YOLOv11】010、YOLOv11训练流程详解:从数据加载到模型保存的完整步骤
  • AI大模型背后的关键单位,你真的了解它吗?
  • cpp算法编程中可能用到的几何知识
  • 2026年青岛发电车租赁公司推荐榜:市南区/市北区/黄岛区/崂山区/李沧区/城阳区/即墨区/胶州市/平度市发电车租赁公司选择指南 - 海棠依旧大
  • 模型、Harness与记忆如何帮助Agent持续学习(Continual Learning)?
  • 高效稳定LDO芯片选型指南:从原理到实战应用
  • VutronMusic:你的跨平台音乐播放器终极解决方案
  • 2026年大模型从入门到精通:AI风口必学,高薪技能速成!错过等不起!
  • Java: File
  • 前端创新技术探索
  • LeetCode Hot100 - 4. 移动零(Java 题解)
  • 009、Python流程控制:条件判断(if/elif/else)
  • 函数用法记录——MATLAB符号计算
  • uniapp Uview框架中u-search组件实现动态搜索与数据过滤
  • Tiktokenizer高性能架构设计:深入解析Token可视化引擎的实现原理
  • WPF DataContext实战:三种绑定方式深度解析
  • 构建“私有第二大脑”:基于 Graph-RAG 的本地知识图谱 Agent 搭建指南
  • OpenClaw:AI Agent引擎驱动的企业全流程智能助手
  • “一眼识万物”:用Rokid AI Glasses与灵珠平台打造植物百科助手
  • AIAgent为何总“好心办坏事”?SITS2026首席科学家解密价值对齐的5个隐性断层及实时干预协议
  • mPDF终极指南:PHP PDF生成库的深度技术解析与实战应用
  • 【RJ 45连接器】RJ45 网络连接器 3D 模型 3 零件装配体 SolidWorks 源文件 含 STEP/IGS 通用格式
  • Python 函数完全指南:参数、返回值与高级用法