多态在智能家居系统中通过统一接口SmartDevice实现不同品牌家电的开关控制,各设备类实现该接口并封装私有通信逻辑,中央控制器仅依赖接口批量调度,新增设备无需修改原有逻辑。

多态在智能家居系统中,核心是用统一接口操作不同品牌家电的开关,而不关心具体实现——比如调用 device.turnOn() 就能让格力空调、小米灯泡、海尔电视各自以自己的方式启动。
定义统一的设备控制接口
先抽象出所有家电共有的行为,例如开关、调节亮度/温度等。用接口(或抽象类)封装这些能力:
-
接口定义简洁明确:
public interface SmartDevice {<br> void turnOn();<br> void turnOff();<br> String getBrand();<br>} - 每个品牌设备实现该接口:
class MideaAirConditioner implements SmartDevice { ... }class XiaomiBulb implements SmartDevice { ... }class HaierTV implements SmartDevice { ... } - 接口不暴露厂商私有逻辑(如红外码、MQTT Topic、API密钥),只暴露语义一致的操作。
用多态容器统一调度设备
系统主控模块(如中央控制器)只依赖 SmartDevice 接口,不感知具体类型:
- 把不同品牌设备存进同一集合:
List<SmartDevice> devices = Arrays.asList(<br> new MideaAirConditioner(),<br> new XiaomiBulb(),<br> new HaierTV()<br>);
- 批量开关只需一行循环:
devices.forEach(SmartDevice::turnOn); // 各自执行自己的 turnOn - 新增品牌(如美的新风扇)只需实现接口、加入列表,无需修改原有控制逻辑。
结合策略模式处理差异化通信协议
不同品牌底层通信方式不同(HTTP API、蓝牙、红外、MQTT),但对外仍保持统一开关语义:
立即学习“Java免费学习笔记(深入)”;
- 在具体实现类内部封装协议细节:
MideaAirConditioner.turnOn()发送 HTTP 请求到格力云平台;XiaomiBulb.turnOn()通过局域网 UDP 向米家网关发指令;HaierTV.turnOn()调用私有 SDK 的红外模拟方法。 - 必要时可将通信逻辑进一步解耦为策略对象(如
CommunicationStrategy),让设备类组合使用,提升复用性与测试性。
运行时类型安全与扩展提醒
多态不等于放弃类型信息,实际工程中常需适度识别设备能力:
- 用
instanceof或Class.isAssignableFrom()做轻量判断(如“只有空调支持 setTemperature()”),避免强转异常; - 更推荐用能力接口分离职责,例如:
interface TemperatureControllable { void setTemperature(int c); }
让MideaAirConditioner同时实现SmartDevice和TemperatureControllable;
主控按需向下转型或使用Optional.ofNullable(...).filter(...)安全调用。 - 避免在接口里堆砌所有可能方法(如给灯泡加
setTemperature()),违背接口隔离原则。


















