使用Lambdas重构观察者设计模式

点击蓝字

640?wx_fmt=gif

关注我们


在本文中,我们将讨论如何使用Java 8 lambda表达式.

许多现有的面向对象设计模式可以使用lambda表达式变得冗余或以更简洁的方式编写。例如,如果我们已经使用JDK 6或7在我们的项目中实现了观察者设计模式,那么您可以使用Lambda表达式.


640?wx_fmt=jpeg


让我们用一个详细的例子来理解这种重构技术。



640?wx_fmt=png

观测器设计模式的定义


这意味着在对象之间定义一对多的依赖关系,这样当一个对象更改状态时,它的所有依赖项都会被自动通知和更新。


观察者设计模式是一种常见的解决方案,当某个对象(称为主题)发生某些事件(例如,状态更改)时,需要自动通知其他对象的列表(称为观察者)。在使用GUI应用程序时,通常会遇到这种模式。您可以在GUI组件(如按钮)上注册一组观察者。如果单击按钮,则通知观察者并执行特定操作。但是,观察者的模式并不局限于GUI。例如,观察员设计模式也适用于几个交易者(观察员)可能希望对股票(主体)的价格变化作出反应的情况。



640?wx_fmt=png

类图


640?wx_fmt=png

让我们参考上面的类图并编写一些代码,看看观察者模式在实践中是如何有用的。让我们为像Twitter这样的应用程序设计和实现一个定制的通知系统。这个概念很简单:几家报社(“纽约时报”、“卫报”和“世界报”)订阅新闻tweet的提要,如果tweet包含特定关键字,则可能希望接收通知。


为了更好地理解,让我们首先实现观察者设计模式,而不使用Java 8 lambda。



640?wx_fmt=png

观察者模式:不使用Lambda表达式


创建一个观察者接口,对不同的观察者进行分组。它只有一个方法叫做通知这将由主题(Feed)在新的推文可用时调用。

640?wx_fmt=png

让我们创建不同的观察者(这里,三家报纸),为包含在推特中的每一个不同的关键字生成不同的操作。

640?wx_fmt=png 640?wx_fmt=png

让我们定义一个学科接口。

640?wx_fmt=png

这是一个非常简单的实现-提要保存了一个观察者的内部列表,然后它可以在推特到达时通知它。

640?wx_fmt=png

我们现在可以创建一个演示应用程序来连接主体和观察者。

640?wx_fmt=png

注意,实现观察者接口都为一个方法提供了一个实现:inform(). 



640?wx_fmt=png

观察者模式:使用Lambda表达式


当一条推特到达时,他们都只是在包装一条行为来执行!Lambda表达式专门为移除样板而设计的。与显式实例化三个观察者对象不同,您可以直接传递一个lambda表达式来表示要执行的行为:

640?wx_fmt=png



640?wx_fmt=png

结语


我们应该一直使用lambda表达式吗?答案是否定的。在我们描述的示例中,lambda表达式工作得很好,因为要执行的行为很简单,因此它们有助于删除样板代码。但是,观察者可能更复杂:他们可以有状态,定义几种方法,等等。在这种情况下,你应该坚持上课。






640?wx_fmt=jpeg

长按识别二维码,关注Java高级部落



640?wx_fmt=gif

更多精彩内容,尽在阅读原文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值