0

我有一个 OOP 设计问题(我使用的是 java,但问题更笼统)。我正在编写家庭自动化模拟器,但我在设计它时遇到了一些麻烦。每个设备都有一个类,例如带有相应方法的TVHeating ,例如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,...)并触发动作时,我将创建具有所需动作的警报实例,观察所需的传感器。这样做的问题是我将需要很多很多动作类(可能通过使用诸如 VolumeControllable 之类的设备将实现的接口来减少它们)。

有什么我遗漏的吗?这可以更简单/不需要使用这么多的 Action 类吗?谢谢你。

4

2 回答 2

0

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

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

于 2013-03-27T18:28:00.343 回答
0

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

这样,您的控制器可以处理规​​则(或者您甚至可以将规则设备插入控制器。它可以监视“IF living-room-tv is turn-on-event AND motion-detector-living-room is active in the controller.最后 60 秒 THEN 执行调暗客厅灯场景”

显然,当设备想要控制自己时会出现问题(如果您点击电视上的频道向上按钮,控制器怎么知道?)但否则,只要电视不自行调暗灯光,控制器将永远处于正确的状态,让规则做正确的事情。

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

于 2014-06-26T19:10:06.833 回答