Swift中的设计模式:观察者模式

欢迎来到一系列致力于学习设计模式的文章。 尽管许多想法与代码无关,但我们的目标是向您展示如何在Swift中实现它们(在撰写本文时为Swift 3.0)。 每个帖子彼此独立,所有项目代码都可以 在Git上找到

观察者模式允许对象订阅所谓的主题。 主题更新后,将通知所有已订阅主题的对象有关更新的信息。 当对象之间存在一对多关系时使用。

观察者模式的常见实现使您能够:

添加一个观察者

这实际上告诉主题“嘿,我想加入循环”,并且在更新其他观察者时保持更新。 将该主题想成小组中总是有八卦并且想告诉别人的人。

通知观察员

观察者订阅后,我们将调用接口中定义的共享函数。 所有观察者都将实现此接口。

移除观察者

可能希望删除对象,而不再希望对其进行更新,因此我们必须给予机会删除它们。

许多语言和SDK都有自己的实现。 iOS将其与Notification Center及其NSNotificationCenter类一起使用。 使用“推送通知”,用户可以订阅以收听来自应用程序的更新,然后应用程序/服务器( 主题 )将通知推送到用户设备,并且用户始终可以选择通过删除应用程序来取消订阅。

我们将使用一个用户希望以二进制,八进制和十六进制格式显示数字的示例。 他们只想输入一次该号码。

该程序的UML图将如下所示:

首先,在Xcode中创建一个新项目。 我们不会在UIKit中碰任何东西,因此创建一个macOS Terminal项目。

首先,我们将从创建观察者协议开始。 该协议将包含id属性。 这将使我们以后可以删除观察者。 该代码将如下所示:

接下来,我们将创建Subject类。 这将是负责通知对象有关更新的类。 当我们附加一个Observer时,我们将其添加到ObserverArray中 。 当我们通知其他对象时,我们遍历ObserverArray并调用Observer协议中包含的update()函数。 看起来像这样:

继承Observer协议的类的工作是为Subject分配一个id,并在从Subject调用update()方法时执行该方法。 它们将如下所示:

现在是时候将它们放在一起了。 在类中,我们要创建一个Subject对象。 我们创建的所有观察者将被分配相同的Subject 。 然后,我们给主题分配一个数字。 然后,我们将再次进行显示更新。 它看起来像这样:

终端输出将如下所示:

 二进制:1111 
八进制:17
十六进制:f
二进制数:10
八进制:2
十六进制:2
程序以退出代码结束:0

如您所见,每次我们更新主题时,它都会通知所有涉及的观察者,调用update()方法,然后在屏幕上看到打印输出。 大!

奖励—移除观察者

观察者模式的一个关键方面是能够删除观察者的能力。 打开Subject类并输入以下代码:

这将使用我们提供的ID从数组中删除Observer,因此不再更新。 转到类,然后对其进行修改,使其类似于以下内容:

这会将BinaryObserverSubject中移除,并使其不再需要通知。 运行它,您将获得如下所示的内容:

  二进制:1111 
八进制:17
十六进制:f
八进制:2
十六进制:2
程序以退出代码结束:0

二进制行仅出现一次,因为在下一次更新之前已将其删除。 欢呼! 和往常一样,以上所有代码都可以在Git上找到

山姆·斯通(@ Stonesam92)| 推特
Sam Stone(@ Stonesam92)的最新推文。 移动开发人员和嘻哈迷。 #iosdev #swiftlang #objC。 曼彻斯特… twitter.com