
1. 项目背景与需求分析第一次接触家居强电电路模拟程序这个题目时我盯着需求文档发了半小时呆。作为Java初学者要完整实现一个包含串联、并联电路计算还能模拟开关、灯具、风扇等电器状态的程序确实让人头皮发麻。但拆解后发现这其实是个绝佳的OOP面向对象编程实战项目。家居电路的核心需求可以归纳为三点第一要能构建电路拓扑结构包括串联和并联两种基本连接方式第二需要模拟各类电器设备的工作状态比如开关的通断、灯具的亮度变化第三必须实现电路参数计算特别是电压分配和电流流动的逻辑。这正好对应了Java中抽象类、接口和多态这些核心概念的应用场景。我建议从绘制类图开始。用PowerDesigner画出Electric抽象类作为基类其下派生串联电路SeriesCircuit和并联电路ParallelCircuit两个子类。设备方面抽象类Equipment可以定义电压、电阻等公共属性具体设备如Switch、Light、Fan等继承实现各自的特有行为。这种设计既符合现实世界的电路组成又能很好地映射到Java的类继承体系。2. 核心类设计与实现2.1 电路基类设计抽象类Electric是整个系统的核心我给它定义了三个关键方法public abstract class Electric { protected double voltage; protected int resistance; public abstract void calculateVoltage(double inputVoltage); public abstract void updateStatus(); public abstract void display(); }串联和并联电路的区别主要在电压计算逻辑上。串联电路的总电阻是各器件电阻之和电流相同并联电路则要计算等效电阻各支路电压相同。这里用到了多态的特性public class SeriesCircuit extends Electric { private ListEquipment equipments; Override public void calculateVoltage(double inputVoltage) { double totalResistance equipments.stream() .mapToInt(e - e.getResistance()).sum(); double current inputVoltage / totalResistance; for(Equipment e : equipments) { e.setVoltage(current * e.getResistance()); } } } public class ParallelCircuit extends Electric { private ListElectric branches; Override public void calculateVoltage(double inputVoltage) { double equivalentResistance 1.0 / branches.stream() .mapToDouble(b - 1.0/b.getResistance()).sum(); for(Electric branch : branches) { branch.calculateVoltage(inputVoltage); } } }2.2 设备类的实现设备类的层次结构设计让我踩过坑。最初我把所有设备都直接继承Equipment结果发现控制器Controller和负载Load的行为差异太大。后来调整为更合理的继承关系Equipment (抽象类) ├─ Switch (开关) ├─ Controller (抽象类) │ ├─ Dimmer (调光器) │ └─ FanSpeedController (风扇调速器) └─ Load (抽象类) ├─ Light │ ├─ IncandescentLight (白炽灯) │ └─ FluorescentLight (日光灯) └─ Fan ├─ CeilingFan (吊扇) └─ StandingFan (落地扇)以白炽灯为例它的亮度计算需要根据电压分段处理public class IncandescentLight extends Light { Override public void updateStatus() { if(voltage 220) { brightness 200; } else if(voltage 10) { brightness (int)(5 * voltage / 7 43); } else { brightness 0; } } }3. 电路计算算法3.1 电压分配计算电路计算最复杂的是处理混合电路既有串联又有并联。我的解决方案是采用递归计算遇到并联电路时先计算各支路的等效电阻再根据总电压分配支路电压。public void calculateCircuit(Electric circuit, double inputVoltage) { if(circuit instanceof SeriesCircuit) { SeriesCircuit sc (SeriesCircuit)circuit; double totalR sc.getTotalResistance(); double current inputVoltage / totalR; for(Equipment e : sc.getEquipments()) { e.setVoltage(current * e.getResistance()); if(e instanceof Electric) { calculateCircuit((Electric)e, e.getVoltage()); } } } else if(circuit instanceof ParallelCircuit) { ParallelCircuit pc (ParallelCircuit)circuit; for(Electric branch : pc.getBranches()) { calculateCircuit(branch, inputVoltage); } } }3.2 状态更新策略当用户操作开关或调节控制器时需要触发全电路重新计算。这里我使用了观察者模式设备状态变化时通知所属电路public class Switch extends Equipment { private boolean isOn; private ListCircuitObserver observers new ArrayList(); public void toggle() { isOn !isOn; notifyObservers(); } private void notifyObservers() { for(CircuitObserver o : observers) { o.onStateChanged(); } } }4. 代码优化与重构4.1 使用设计模式改进初期版本的主类有近500行代码经过三次重构后主要做了这些改进引入工厂模式创建设备对象public class EquipmentFactory { public static Equipment createEquipment(String type, String id) { switch(type) { case K: return new Switch(id); case B: return new IncandescentLight(id); // 其他设备类型... default: throw new IllegalArgumentException(); } } }用策略模式封装不同的电压计算算法public interface VoltageCalculationStrategy { double calculate(Electric circuit, double inputVoltage); } public class SeriesCalculation implements VoltageCalculationStrategy { // 实现串联计算逻辑 }4.2 代码质量分析用SourceMonitor分析时发现几个典型问题Main类的圈复杂度高达15通过提取方法重构后降到8比较器Comparator的compare方法有6层嵌套改用策略模式优化设备状态显示存在重复代码引入模板方法模式public abstract class Equipment { // 公共显示逻辑 public final void display() { System.out.println(getHeader()); System.out.println(getStatus()); } protected abstract String getHeader(); protected abstract String getStatus(); }这个项目让我深刻体会到好的Java程序不是一蹴而就的。从最初能运行的基础版本到后来结构清晰的优化版中间经历了三次大规模重构。最值得分享的经验是写代码前一定要先画好类图磨刀不误砍柴工遇到复杂逻辑时不要急着写代码先用伪代码描述清楚算法流程最后单元测试不是可选项而是必选项它能帮你尽早发现设计缺陷。