使用C++实现的状态模式或观察者模式

4
我对观察者和状态模式的区别感到有些困惑。我接到了一个项目,客户是飞行中的飞机,它会计算不同传感器的数据,例如 GPS、速度、燃油水平,然后将数据发送到网络,再发送到服务器。目前,我已经在我的类图中使用了观察者模式。类图可以从下面查看,请告诉我我的解决方案是否正确,是否选择了正确的设计模式。 Class Diagram

看起来你对观察者模式有一些误解。在你的情况下,被更新的组件(如速度、GPS、引擎燃料等)被称为“可观察对象”或“主题”,而想要了解“主题”更新的组件被称为“观察者”。 - Chetan Kinger
2个回答

3
我有点困惑观察者模式和状态模式之间的区别。 观察者模式主要用于当您有一个对象或一组对象(称为观察者),希望被通知/更新一个或多个对象的状态(称为可观察对象或主题)的任何更改时。在您的示例中,Network是希望了解飞机数据变化的观察者。另一方面,飞机数据对象,如SpeedGPS等是可观察主题Network希望跟踪这些对象的变化。 (您的术语似乎颠倒了)。每当飞机数据,如其Speed发生变化时,相应的Speed对象必须通知Network关于此更改。
另一方面,当您的用例可以表示为有限状态机时,通常使用状态模式。在您的示例中,飞机的整个起飞、飞行和降落过程可以用逻辑状态(如着陆、起飞、飞行、降落等)组成的有限状态机表示。
现在应该清楚,观察者模式和状态模式都可以在您所描述的主要问题陈述中有效应用,其中观察者模式适用于此问题陈述。尽管如此,没有必要拥有单独的可观察对象(例如速度、GPS 等),因为您可以拥有一个名为“FlighData”的单个可观察对象,它具有诸如速度、GPS、引擎油量、引擎温度等属性。
我还建议您在实现应用程序之前更好地了解观察者模式。以下是一些入门链接:

1

创建一个状态-事件-动作自动机来定义系统(例如用于错误、互锁或其他检查条件等),可以在此处使用状态设计模式。 当存在一对多关系时,例如如果修改了一个对象,则应自动通知其依赖对象,此时使用观察者设计模式。当可观察对象不知道观察者的数量,并且应能够在不知道对象的情况下通知其他对象时,我们使用观察者设计模式。


你说过: “当对象之间存在一对多的关系时,就会使用观察者模式。”这并不是准确的。即使只有一个可观察对象被单个观察者观察,你仍然可以使用观察者模式。此外,你提到状态模式是更好的选择,但没有解释原始问题中的示例如何通过状态模式更好地实现。给定示例的哪些组件可以适用于状态模式?以及如何适用?目前,你似乎已经定义了模式,但没有说明它们在当前情况下的应用。 - Chetan Kinger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接