针对返回不同数据的相似设备类,应使用何种设计模式泛化其使用?
如何泛化不同传感器的数据收集逻辑?
这问题我太熟悉了!你手里有一堆不同类型的传感器类,每个的GetData方法返回的类型都不一样,现在要做一个定期收集数据的类,想统一它们的使用方式对吧?最适合的方案是结合泛型接口来标准化所有传感器的行为,再配合一个通用的收集类来处理,完全符合开闭原则,后续加新传感器也不用改收集逻辑。
具体实现步骤:
1. 定义通用的泛型传感器接口
先给所有传感器定一个统一的“规矩”,不管你是什么传感器,都得实现这个接口,这样收集类就不用关心你具体是什么类型:
public interface ISensor<T> { // 统一的数据获取方法,T就是每个传感器返回的数据类型 T GetData(); }
2. 让现有传感器实现这个接口
把你现有的几个传感器类都改成实现上面的接口,对齐统一的行为:
- 移动传感器:
public class MoveSensor : ISensor<uint> { public uint GetData() { // 保留你原来的逻辑 } }
- 温度传感器:
public class TemperatureSensor : ISensor<double> { public double GetData() { // 保留你原来的逻辑 } }
- 多合一传感器单元:
public class MultiSensorUnit : ISensor<MultiSensorData> { public MultiSensorData GetData() { // 保留你原来的逻辑 } } // 你的MultiSensorData类保持不变 public class MultiSensorData { public int SomeSensor1Data { get; set; } public byte SomeSensor2Data { get; set; } public double SomeSensor3Data { get; set; } }
3. 编写通用的数据收集类
现在收集类就可以用统一的方式处理所有传感器了,不管它返回的是uint、double还是自定义的MultiSensorData:
public class PeriodicDataCollector { // 可以维护一个传感器列表,批量处理 private readonly List<ISensor<object>> _registeredSensors = new(); // 注册传感器到收集器 public void RegisterSensor<T>(ISensor<T> sensor) { // 把泛型传感器转成object类型存入列表,方便批量处理 _registeredSensors.Add(new SensorWrapper<T>(sensor)); } // 定期执行的收集逻辑 public void CollectAllData() { foreach (var sensor in _registeredSensors) { var data = sensor.GetData(); // 这里可以统一做数据处理:比如存储到数据库、上报到服务器、打日志等 ProcessCollectedData(data); } } private void ProcessCollectedData(object data) { // 根据数据类型做针对性处理,比如序列化、格式转换等 Console.WriteLine($"收集到数据:{JsonSerializer.Serialize(data)}"); } // 内部包装类,用来把泛型ISensor<T>转成ISensor<object> private class SensorWrapper<T> : ISensor<object> { private readonly ISensor<T> _sensor; public SensorWrapper(ISensor<T> sensor) { _sensor = sensor; } public object GetData() { return _sensor.GetData(); } } }
4. 特殊情况处理:适配器模式
如果以后遇到某个传感器不符合这个接口(比如老设备的方法叫FetchData而不是GetData),不用改老代码,用适配器模式包装一下就行:
// 假设这是一个老传感器 public class OldPressureSensor { public int FetchPressure() { // 老逻辑 } } // 适配器类,把老传感器转成符合ISensor<T>的接口 public class PressureSensorAdapter : ISensor<int> { private readonly OldPressureSensor _oldSensor; public PressureSensorAdapter(OldPressureSensor oldSensor) { _oldSensor = oldSensor; } public int GetData() { // 适配老方法 return _oldSensor.FetchPressure(); } }
为什么选这个方案?
- 统一性:所有传感器都遵循同一个接口,收集类不用写一堆if-else判断类型
- 扩展性:新增传感器只要实现
ISensor<T>接口就行,完全不用修改收集类的代码,符合开闭原则 - 灵活性:配合适配器模式,能兼容各种特殊的老设备或第三方传感器
内容的提问来源于stack exchange,提问作者pepeevich
相关产品推荐
相关产品推荐

