首页 > 解决方案 > Java:如何通知对象?(哪些模式/...)

问题描述

ACarManufacturer创建 aCar并将其存储在 a 中,ParkPlace直到汽车售出。制造商必须在特定时间知道未售出的汽车在哪里。例如,如果a从 a 取车ParkPlace,则必须“通知”制造商(没有定义“通知”可能是什么,因为我不知道哪种实现会更好)

我觉得这是一个可以手动检索对象的经典问题。我可以遍历世界各地所有工厂的所有公园位置,并检查哪个是制造商的。但它效率低下。解决这个问题的标准方法是什么?

创建一个充当两个聚合类之间包装器的类是否正确?就像 C 中的指针指针一样。

这是我的 UML 类图(法语:VoitureCarConstructorCarManufacturerFicheRecordPlaceParkPlaceRangee是停车场中的):

UML 类图

约束:

如何解决这个问题,或者它是一个正确的实现?

标签: javauml

解决方案


问题

您的问题尚不完全清楚,但我了解:

  • 停车场由独立于制造商的一方拥有或管理。
  • 该方进行销售,
  • 这就是您想要通知的原因。

潜在的解决方案

您的问题的经典解决方案是观察者模式:一个Observable对象通知一个或几个Observer它的状态已经改变。然后通过调用 的方法来实现通知Observer,最终将调用对象的引用传递给该方法(以防观察者同时跟踪多个可观察对象)。

另一种解决方案是使用事件驱动架构。诸如将汽车从一个地方移动到另一个地方、出售汽车等事件由负责对象发布到一个或多个事件队列,事件处理器会执行所需的操作。在你的情况下,你可以想象一个 CarEvent 队列,其中每个制造商都会关注与他的汽车相关的事件。

你需要做什么

不幸的是,您的模型中有太多不清楚的问题。例如:

  • 出售 Record时会发生什么?Car
  • 为什么不Car关联到Manufacturer也?
  • 为什么不ParkPlace知道manufacturer,或者至少不Record知道拥有Manufacturer

所以你需要做的是在你的设计中明确职责。例如:

  • ParkPlace一个Observable?但是谁应该是那个Observer:那个Record还是那个Manufacturer
  • 或者是Parkplace唯一的方法找到Record,Record是,Observable和? ManufacturerObserver
  • 谁负责将汽车(其记录)分配到某个地方?在您的图表中,ParkPlace 和 Record 都有一个分配给另一个的功能,那么是谁发起的?

您还需要考虑聚合:您是否真的想直接从Place聚合访问Record另一个聚合,而不通过聚合根,即制造商?

一旦你澄清了这一切,你需要重新考虑沿关联的可导航性。这将帮助您做出正确的实施选择。Manufacturer具体来说,在您的图表中,从to的关联似乎Record是作为 in 的列表实现RecordsManufacturer。这种实现关联的方式意味着从制造商到记录的可导航性,而不是相反。


推荐阅读