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,因此不再更新。 转到主类,然后对其进行修改,使其类似于以下内容:
这会将BinaryObserver从Subject中移除,并使其不再需要通知。 运行它,您将获得如下所示的内容:
二进制:1111
八进制:17
十六进制:f
八进制:2
十六进制:2
程序以退出代码结束:0
二进制行仅出现一次,因为在下一次更新之前已将其删除。 欢呼! 和往常一样,以上所有代码都可以在Git上找到 。
山姆·斯通(@ Stonesam92)| 推特
Sam Stone(@ Stonesam92)的最新推文。 移动开发人员和嘻哈迷。 #iosdev #swiftlang #objC。 曼彻斯特… twitter.com
- 无法使用导航控制器在视图控制器上locking设备方向
- 我如何使用NSDateFormatter有什么问题?
- 是否有任何通知发送键盘更改时(如从NumberPad到默认)
- Xcode 8显示configuration文件不包含签名证书的错误
- 现有的ios项目SDK的appcelerator模块
- 故事板中的UIViewController标题属性
- UIScrollView无法使用自动布局放大iOS7
- 在UiWebView – NSURLConnection / CFURLConnection HTTP加载失败(kCFStreamErrorDomainSSL,-108)
- 如何parsing具有dynamic密钥节点的JSON