如果您要处理不止一种设备类型,那么控制器 + 设备接口分离(使用名称值对进行通信)将是一个很好的解决方案
解耦
使用名称值对允许您将代码分隔为设备 + 控制器 + 应用程序代码结构
示例代码
class DeviceInterface
{
void Initialize(IController & Controller);
void Close();
bool ChangeParameter(const string & Name, const string & Value);
bool GetParam(string & Name, string &Value );
}
每个设备实现在创建时都应使用可以接受其命令并将其转换为实际设备命令的控制器的标识来创建
interface IController
{
Initialize(DeviceSpecific & Params);
Close();
bool ChangeParameter(string & Name, string & Value);
bool ChangeParams(string & Name[], string &Value []);
}
您的用户代码看起来像这样
IController objController = new MeasurementDevice(MeasureParram);
DeviceInterface MeasureDevice = new DeviceInterface(objController);
string Value;
MeasureDevice.GetParam("Temperature", Value);
if (ConvertStringToInt(Value) > 80)
{
MeasureDevice.ChangeParameter("Shutdown", "True");
RaiseAlert();
}
DeviceInterface 类应该做的就是将命令传递给控制器。控制器应负责设备通信。
界面分离的优势
防止更改
这种解耦可以让您将应用代码与控制器隔离开来。设备更改不会影响您的用户代码
应用程序代码的可维护性
此外,用户代码始终是干净的,您只需关心应用程序逻辑。但是,如果您定义了多个接口/创建的模板或具有多种类型的特定于控制器的参数结构的泛型,那么您的代码中将包含大量与设备相关的垃圾,这可能会损害可读性并在您的设备/其参数发生变化时产生维护问题。
易于实施
您还可以将不同的控制器实现拆分到自己的项目中。此外,您的应用程序还可以使用 XML 文件等以更动态的方式配置命令和响应,这些文件可以与控制器类一起发布,从而使您的整个应用程序在本质上变得更加动态。
现实生活
该领域领导者的最新生产控制器项目之一以相同的方式工作。但他们使用 LON 进行设备通信。
伦敦?
控制器(例如空调/锅炉/风扇等)网络中使用的 LON 协议使用此概念与各种设备通信
因此,您只需要一个接口即可与您的设备通信,然后使用 LON 将名称值对发送给它。他使用标准协议还可以让您与测量仪器以外的其他设备通话。如果您的设备使用 LON,则可以使用 LON 的开源实现。
如果您的设备不支持 LON,那么您可能必须设计一些东西,其中用户代码仍然适用于名称值对,并且相反的接口将您的名称值对转换为等效的对应控制器 struct+ 并与设备理解的方式。
希望这有用。