【问题标题】:State or observer pattern in object C++对象 C++ 中的状态或观察者模式
【发布时间】:2017-01-03 19:49:47
【问题描述】:

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

【问题讨论】:

  • 您似乎在某些方面误解了观察者模式。更新的组件(在您的情况下是速度、gps、engineFuel 等)被称为 Observable 或 Subject 并且想要了解更新的组件Subject 被称为 Observer。

标签: design-patterns uml observer-pattern class-diagram state-pattern


【解决方案1】:

我只是对观察者模式和状态模式之间的区别有点困惑

Observer 模式主要用于当您有一个对象或一组对象(称为观察者)想要获悉/更新一个或多个对象状态的任何变化时(称为 Observables 或 Subjects)。在您的示例中,Network 是 Observer,它想了解飞机数据的变化。另一方面,Speed、GPS 等 Airplane 数据对象是 Network 想要跟踪更改的 Observable 或 Subjects . (您的术语似乎颠倒了)。每当诸如 Speed 之类的 Airplane 数据发生变化时,必须通过相应的 Speed 对象通知 Network 这一变化。

另一方面,State 模式主要用于当您的用例可以表示为有限状态机时。在您的示例中,飞机的整个起飞、飞行和着陆过程可以用有限状态机表示,具有着陆、起飞、飞行中、着陆等逻辑状态。

现在应该清楚 Observer 和 State 模式在你的情况下都有一个有效的应用程序,Observer 模式很适合您在问题中描述的主要问题陈述。也就是说,不需要单独的 Observable 对象,例如速度、GPS 等。您可以拥有一个名为 FlighData 的单个 Observable 对象,该对象具有速度、GPS、engineFuelLevel、engineTemp 等属性。

我还建议您在应用程序中实现 Observer 模式之前更好地理解它。以下是一些入门链接:

【讨论】:

    【解决方案2】:

    制作一个状态事件动作自动机来定义系统(比如错误、互锁或其他一些检查条件等)——可以在这里使用状态设计模式。 当对象之间存在一对多关系时使用观察者模式,例如如果一个对象被修改,它的依赖对象将被自动通知。当 observable 不知道观察者的数量并且应该能够在不知道对象的情况下通知其他对象时,我们使用观察者设计模式。

    【讨论】:

    • 您说,“对象之间存在一对多关系时使用观察者模式”。不对。即使您有一个被单个 Observable 观察的 Observable,您也可以使用观察者模式。此外,您提到状态模式是一个更好的选择,但没有解释原始问题中的示例如何通过状态模式更好地实现。给定示例的哪些组件可以适合状态模式以及如何适合?就目前而言,您似乎已经定义了模式,但没有定义它们在当前上下文中的用途。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 2021-11-22
    • 2013-12-30
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多