家庭自动化,解耦电器和对它们所做的操作



我有一个面向对象的设计问题(我使用java,但问题更一般)。我正在编写家庭自动化模拟器,我在设计它时遇到了一些麻烦。每个设备都有一个类,如电视加热具有相应的方法,如volumeUp(),…我想解耦类的设备和传感器产生的事件和执行的动作对他们。我可以这样想:我将实现观察者模式,将事件从传感器传播到警报类。闹钟类看起来像这样:

class Alarm implements Observer {
    Action action;
    public update(...) { action.do() }
}

现在,因为我想让用户能够任意耦合传感器和它们在用户界面中触发的动作,我想为每个设备上的每个动作创建单独的类

class ActionTVVolumeUp implements Action {
    Television tv;
    ActionTVVolumeUp(Television tv) { this.tv = tv; }
    public void do() { tv.volumeUp() }
}

然后当用户在用户界面中指定传感器(MotionSensor,LightSensor,…)和动作触发时,我将创建具有观察所需传感器的所需动作的Alarm实例。这样做的问题是,我将需要许多操作类(可能通过使用设备将实现的volumecontrolable之类的接口来减少它们)。

是否有我错过的东西,这可以做得更简单/不需要使用这么多的动作类?谢谢你。

如何:每个设备提供它可以执行的操作的查找,例如将人类可读的名称映射到方法的字典。每个传感器都有一个动作(方法)列表,它应该在触发时调用。UI只是向传感器添加方法。

在c#中,传感器的方法列表将是一个事件处理程序,而器具方法将是某种委托。然后在UI中,将设备动作挂钩到传感器的代码只是aSensor.actions += anAppliance.aMethod;,我不记得是否/如何将其转换为Java,但我确信有一种方法-也许其他人可以在那里提供帮助。

如何实现通用事件处理程序的通用发布-订阅控制器?您将创建一个名为TV的Appliance实例,而不是电视设备。在每个设备中,您将添加适合于该特定设备的命令。没有任何命令会与其他设备通信,它总是与控制器通信。通过这种方式,控制器维护所有设备的所有状态的副本,并且它将知道何时进行更改,也将知道何时需要进行更改。

这样你的控制器就可以处理规则(或者你甚至可以在控制器中插入一个规则器具)。它可以观察"如果客厅电视打开事件和运动探测器客厅在过去60秒内处于活动状态,那么执行调暗客厅灯光场景"

显然,当设备想要控制自己时,会有一个问题(如果你点击电视上的频道向上按钮,控制器怎么知道?)但除此之外,只要电视本身不调暗灯光,控制器就会一直处于正确的状态,让规则做正确的事情。

如果您可以避免在类中嵌入特定的设备活动,而是一般地处理与可执行操作绑定的名称,那么它应该永远是灵活的。

相关内容

  • 没有找到相关文章

最新更新