译者|蔡竹良策划|YanZhengObservable设计模式存在于许多JavaAPI和反应式编程中。下面介绍Java中的永恒Observable模式。Observable设计模式用于许多重要的JavaAPI。一个众所周知的示例是使用ActionListenerAPI执行操作的JButton。在此示例中,我们的ActionListener监听或观察按钮。单击按钮时,ActionListener将执行操作。可观察模式也用于响应式编程。在反应式应用程序中使用观察者是有意义的,因为反应式的本质是反应式的:当另一个进程发生时事情就会发生。Observable是一种行为设计模式。它的功能是在事件发生时执行一个动作。两个常见的例子是按钮点击和通知,但这种模式还有更多用途。1.Observable模式的例子在Observable模式中,一个对象在执行操作时通知另一个对象。要了解此模式的价值,让我们想象一个场景,其中需要单击一个按钮而另一个对象未??得到通知,如图1所示。请注意,ActionCheck必须每秒检查一次按钮。现在,想象一下,如果我们每秒对该按钮进行多次操作检查。您能想象这会对您的应用程序性能产生什么影响吗?让DoSomething按钮通知ActionCheck。这样,ActionCheck逻辑就不需要每秒轮询DoSomething按钮。2.Observable设计模式的元素如下图所示。请注意,Observer模式的基础是Observer接口(即被观察对象)和Subject(被观察对象)。Newsletter类实现了Subject,而Subscriber实现了Observer。最后,SendEmailMain实现了Observable设计模式。3、代码中的Observable模式Subject接口,又称Observable或Publisher,是Observable设计模式的基础。基本上,它存储观察者并在观察到的动作发生时立即通知他们。看一下主题界面。publicinterfaceSubject{voidaddSubscriber(Observerobserver);voidremoveSubscriber(Observer观察者);voidnotifySubscribers();}1.观察者接口接口(Observer有时也称为Subscriber)由订阅者实现,它试图观察操作是否已经执行:publicinterfaceObserver{publicvoidupdate(Stringemail);}2.Observableinaction让我们用一个时事通讯的例子来实现这个Subject接口。在下面的代码中,我们存储我们的观察者(在本例中为时事通讯订阅者),每个订阅者在他们的电子邮件添加到订阅时都会收到通知。importjava.util.ArrayList;importjava.util.List;publicclassNewsletter实现Subject{protectedListobservers=newArrayList<>();受保护的字符串名称;受保护的字符串newEmail;publicNewsletter(Stringname){this.name=name;}publicvoidaddNewEmail(StringnewEmail){this.newEmail=newEmail;通知订阅者();}@OverridepublicvoidaddSubscriber(Observerobserver){observers.add(observer);}@OverridepublicvoidremoveSubscriber(Observerobserver){observers.remove(observer);}@OverridepublicvoidnotifySubscribers(){observers.forEach(observer->observer.update(newEmail));}}3.Subscriber类表示订阅电子邮件时事通讯的用户。这个类实现了观察者接口。它是我们将观察的对象,以便我们知道事件是否发生。类Subscriber实现Observer{privateStringname;publicSubscriber(Stringname){this.name=name;}@Overridepublicvoidupdate(StringnewEmail){System.out.println("Emailfor:"+name+"|Content:"+newEmail);}}4.发送电子邮件Main现在我们有了使Observable模式有效工作的主类。首先,我们将创建Newsletter对象。然后,我们将添加和删除订阅者。最后,我们将添加一封电子邮件并通知订阅者他们的状态。publicclassSendEmailMain{publicstaticvoidmain(String[]args){NewsletternewsLetter=newNewsletter("JavaChallengers");Observerduke=newSubscriber("公爵");观察者juggy=newSubscriber("Juggy");dock=newSubscriber("MobyDock");newsLetter.addSubscriber(公爵);newsLetter.addNewEmail("LambdaJava挑战赛");newsLetter.removeSubscriber(公爵);newsLetter.addSubscriber(juggy);newsLetter.addSubscriber(码头);newsLetter.addNewEmail("虚拟线程Java挑战赛");}}这是我们代码的输出:Emailfor:Duke|内容:LambdaJava挑战电子邮件:Juggy|内容:虚拟线程Java挑战电子邮件:MobyDock|Content:VirtualThreadsJavaChallenge5.什么时候使用Observable模式当一个动作发生,需要通知多个对象时,最好使用Observable模式而不是Object来多次检查状态。想象一下,有200多个对象需要接收通知;在这种情况下,您必须将200乘以检查发生的次数。通过使用Observable模式,通知对所有订阅者只发生一次。这是一个巨大的性能提升和有效的代码优化。此代码可以轻松扩展或更改。反应式编程范式到处都使用Observable模式。如果你曾经使用过Angular,你就会知道使用Observable组件是很常见的。反应式组件经常被其他事件和逻辑所观察,当满足某些条件时,组件将执行一些动作。6.结论以下是关于Observable设计模式要记住的要点:Observable使用开放和封闭的SOLID原则。这意味着我们可以在不更改方法名称的情况下扩展addSubscriber和removeSubscriber方法。原因是它接收了Subject接口,而不是直接实现它。Observer接口观察发生在Subject中。Subject也称为Observable,因为它是将被观察的Subject。它也可以称为发布者,因为它发布事件。观察者也称为订阅者,因为它订阅主题/发布者。当动作发生时通知观察者。如果我们不使用Observable设计模式,订阅者将不得不不断轮询以了解事件是否发生,这可能会对应用程序性能产生严重影响。Observable是一种更有效的解决方案。原文链接:https://www.infoworld.com/article/3682139/intro-to-the-observable-design-pattern.html译者介绍蔡竹良,社区编辑,从事Java后端开发8年,曾就职上传统广电BOSS系统,后加入互联网电子商务,负责订单、TMS、中间件等。