文章目录
【Java设计模式】通知模式
一、概述
Java中的通知设计模式旨在通过允许对象订阅特定事件并在这些事件发生时异步接收更新,促进系统不同部分之间的异步通信。
二、详细解释及实际示例
- 实际示例:
- 考虑一个天气警报系统作为通知设计模式的现实世界类似示例。在这个系统中,气象站收集天气状况的数据,如温度、湿度和风暴警报。多个订阅者,如新闻机构、智能手机天气应用程序和应急服务部门,对接收特定天气事件的更新感兴趣,如严重风暴或极端温度。
- 当气象站检测到重大事件时,它会发布此信息。所有订阅的实体都会自动接收这些更新,而气象站无需知道这些订阅者的详细信息。例如,新闻机构可能会使用此信息更新其天气报告,而应急服务部门可能会使用它来准备应对潜在的灾害。这个系统体现了通知模式将发布者(气象站)与订阅者解耦并有效传递及时更新的能力。
- 通俗解释:
- 通知设计模式使一个对象能够自动通知一组感兴趣的观察者有关更改或事件,而无需知道订阅者的具体情况。
三、Java中通知模式的编程示例
Java通知模式用于捕获在层之间传递的信息,验证信息,并在需要时将任何错误返回给表示层。它减少了事件的生产者和消费者之间的耦合,增强了组件的灵活性和可重用性,并允许动态订阅和取消订阅事件。
在这个示例中,我们将使用表单提交场景来演示通知模式。该表单用于注册工人的姓名、职业和出生日期。表单数据将传递到域层进行验证,任何错误都将返回给表示层。
以下是RegisterWorkerForm
类,它充当我们的表示层。它接受工人的详细信息作为输入并提交表单。
class RegisterWorkerForm {
private RegisterWorkerForm registerWorkerForm;
RegisterWorkerForm(String name, String occupation, LocalDate dateOfBirth) {
// 用工人的详细信息初始化表单
}
void submit() {
// 提交表单
// 如果有任何错误,它们将被捕获在工人的通知中
}
}
RegisterWorker
类充当我们的域层。它验证工人的详细信息,并通过RegisterWorkerDto
返回任何错误。
class RegisterWorker {
RegisterWorker(String name, String occupation, LocalDate dateOfBirth) {
// 验证工人的详细信息
// 如果有任何错误,将它们添加到通知中
}
}
最后,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框架,其中用户操作触发应用程序中的响应。
- 大规模分布式系统中的通知系统。
- 微服务架构中的事件管理。
六、通知模式的好处和权衡
好处:
- 减少事件的生产者和消费者之间的耦合。
- 增强组件的灵活性和可重用性。
- 允许动态订阅和取消订阅事件。
权衡:
- 如果管理不善,可能会导致系统复杂,因为订阅的动态性质。
- 由于事件的异步和解耦性质,调试可能具有挑战性。