java - Java:如何通知对象?(哪些模式/...)
问题描述
ACarManufacturer
创建 aCar
并将其存储在 a 中,ParkPlace
直到汽车售出。制造商必须在特定时间知道未售出的汽车在哪里。例如,如果a从 a 取车ParkPlace
,则必须“通知”制造商(没有定义“通知”可能是什么,因为我不知道哪种实现会更好)
我觉得这是一个可以手动检索对象的经典问题。我可以遍历世界各地所有工厂的所有公园位置,并检查哪个是制造商的。但它效率低下。解决这个问题的标准方法是什么?
创建一个充当两个聚合类之间包装器的类是否正确?就像 C 中的指针指针一样。
这是我的 UML 类图(法语:Voiture是Car,Constructor是CarManufacturer,Fiche是Record,Place是ParkPlace,Rangee是停车场中的行):
约束:
制造商存储的临时“缓冲区”可以不同步。它不是用 UML 编写的,但是制造商只能拥有对他制造的汽车的引用。
不可能将汽车直接存储在制造商中,因为它们没有地点属性(汽车不拥有地点),也不可能将地点存储在制造商中,因为当汽车移动时,构造函数将还保留对空地方的引用(或使用不同的汽车)。
如何解决这个问题,或者它是一个正确的实现?
解决方案
问题
您的问题尚不完全清楚,但我了解:
- 停车场由独立于制造商的一方拥有或管理。
- 该方进行销售,
- 这就是您想要通知的原因。
潜在的解决方案
您的问题的经典解决方案是观察者模式:一个Observable
对象通知一个或几个Observer
它的状态已经改变。然后通过调用 的方法来实现通知Observer
,最终将调用对象的引用传递给该方法(以防观察者同时跟踪多个可观察对象)。
另一种解决方案是使用事件驱动架构。诸如将汽车从一个地方移动到另一个地方、出售汽车等事件由负责对象发布到一个或多个事件队列,事件处理器会执行所需的操作。在你的情况下,你可以想象一个 CarEvent 队列,其中每个制造商都会关注与他的汽车相关的事件。
你需要做什么
不幸的是,您的模型中有太多不清楚的问题。例如:
- 出售
Record
时会发生什么?Car
- 为什么不
Car
关联到Manufacturer
也? - 为什么不
ParkPlace
知道manufacturer
,或者至少不Record
知道拥有Manufacturer
?
所以你需要做的是在你的设计中明确职责。例如:
- 是
ParkPlace
一个Observable
?但是谁应该是那个Observer
:那个Record
还是那个Manufacturer
? - 或者是
Parkplace
唯一的方法找到Record
,Record
是,Observable
和?Manufacturer
Observer
- 谁负责将汽车(其记录)分配到某个地方?在您的图表中,ParkPlace 和 Record 都有一个分配给另一个的功能,那么是谁发起的?
您还需要考虑聚合:您是否真的想直接从Place
聚合访问Record
另一个聚合,而不通过聚合根,即制造商?
一旦你澄清了这一切,你需要重新考虑沿关联的可导航性。这将帮助您做出正确的实施选择。Manufacturer
具体来说,在您的图表中,从to的关联似乎Record
是作为 in 的列表实现Records
的Manufacturer
。这种实现关联的方式意味着从制造商到记录的可导航性,而不是相反。
推荐阅读
- javascript - 在从 API 更新的网页上拟合多个图像
- angular - 如何让子组件使用父组件样式
- java - 使用 mysql 运行 JDBC 程序时出现此错误
- mysql - 针对多个 %term% 的 MyIsam 全文搜索
- firebase - Flutter 用户注册存储数据
- javascript - 如何使用 Python(BS4?)解析 Javascript 呈现的网页
- javascript - Vue.js: Defining computed environment variables in vue.config.js (vue cli 3)
- android - 跨活动处理服务和发送数据
- docker - 如何在 Docker 容器内启用wiringpi GPIO控制
- gmail-api - 何时生成新的 Gmail API 历史 ID