Java 中的通知模式:利用事件警报增强系统通信
也称为
- 事件监听器
通知设计模式的意图
Java 中的通知设计模式旨在通过允许对象订阅特定事件并在这些事件发生时异步接收更新,从而促进系统不同部分之间的异步通信。
通知模式的详细解释以及现实世界示例
现实世界示例
将天气预警系统视为通知设计模式的现实世界类比示例。在这个系统中,气象站收集有关天气状况(如温度、湿度和风暴警报)的数据。多个订阅者(如新闻机构、智能手机天气应用程序和紧急服务)有兴趣接收有关特定天气事件(如强风暴或极端温度)的更新。
当气象站检测到重大事件时,它会发布此信息。所有订阅实体都会自动接收这些更新,而无需气象站了解这些订阅者的详细信息。例如,新闻机构可能会使用此信息来更新其天气报道,而紧急服务可能会使用它来为潜在灾害做好准备。此系统体现了通知模式在将发布者(气象站)与其订阅者解耦以及高效地传递及时更新方面的能力。
通俗地说
通知设计模式使对象能够自动通知一组感兴趣的观察者有关更改或事件,而无需了解订阅者的详细信息。
Java 中通知模式的编程示例
Java 通知模式用于捕获层之间传递的信息,验证信息,并在需要时将任何错误返回到表示层。它减少了事件生产者和消费者之间的耦合,提高了组件的灵活性和可重用性,并允许动态订阅和取消订阅事件。
在此示例中,我们将使用表单提交场景来演示通知模式。该表单用于注册工人的姓名、职业和出生日期。表单数据将传递到域层进行验证,任何错误都将返回到表示层。
以下是充当表示层的 RegisterWorkerForm
类。它接受工人的详细信息作为输入并提交表单。
class RegisterWorkerForm {
private RegisterWorkerForm registerWorkerForm;
RegisterWorkerForm(String name, String occupation, LocalDate dateOfBirth) {
// Initialize the form with the worker's details
}
void submit() {
// Submit the form
// If there are any errors, they will be captured in the worker's notification
}
}
RegisterWorker
类充当我们的域层。它验证工人的详细信息并通过 RegisterWorkerDto
返回任何错误。
class RegisterWorker {
RegisterWorker(String name, String occupation, LocalDate dateOfBirth) {
// Validate the worker's details
// If there are any errors, add them to the notification
}
}
最后,App
类是创建和提交表单的地方。
public class App {
public static void main(String[] args) {
var form = new RegisterWorkerForm("John Doe", "Engineer", LocalDate.of(1990, 1, 1));
form.submit();
}
}
在此示例中,如果工人的详细信息无效(例如,姓名为空),则 RegisterWorker
类将向通知添加错误。然后,RegisterWorkerForm
类可以在提交后检查通知是否有任何错误。这演示了通知模式,其中信息在层之间传递,任何错误都将返回到表示层。
然后,表单处理提交并将这些错误消息返回给用户,表明我们的通知有效。
示例输出
18:10:00.075 [main] INFO com.iluwatar.RegisterWorkerForm - Error 1: Name is missing: ""
18:10:00.079 [main] INFO com.iluwatar.RegisterWorkerForm - Error 2: Occupation is missing: ""
18:10:00.079 [main] INFO com.iluwatar.RegisterWorkerForm - Error 4: Worker registered must be over 18: "2016-07-13"
18:10:00.080 [main] INFO com.iluwatar.RegisterWorkerForm - Not registered, see errors
何时在 Java 中使用通知模式
- 当更改一个对象需要更改其他对象时,而您不知道需要更改多少个对象。
- 当抽象有两个方面,其中一个方面依赖于另一个方面时。将这些方面封装在不同的对象中可以使您独立地更改和重用它们。
- 当系统组件必须在不做出关于系统其他组件的假设的情况下被通知事件时。
Java 中通知模式的现实世界应用
- GUI 框架,其中用户操作会触发应用程序中的响应。
- 大型分布式系统中的通知系统。
- 微服务架构中的事件管理。
通知模式的优点和权衡
优点
- 减少了事件生产者和消费者之间的耦合。
- 提高了组件的灵活性和可重用性。
- 允许动态订阅和取消订阅事件。
权衡
- 由于订阅的动态特性,如果管理不善,会导致系统复杂。
- 由于事件的异步和解耦特性,调试可能具有挑战性。