Шаблоны программирования на Swift: Observer

example-observer_proSwift_ru

Продолжаем изучать шаблоны программирования на Swift. Сегодня мы поговорим о шаблоне Observer .

Observer

Что такое паттерн Observer? Вот вы когда нибудь подписывались на газету? Вы подписываетесь, и каждый раз когда выходит новый номер газеты вы получаете ее к своему дому. Вы никуда не ходите, просто даете информацию про себя, и организация которая выпускает газету сама знает куда и какую газету отнесту. Второе название этого паттерна – Publish – Subscriber.

Как описывает этот паттерн наша любимая GoF книга – Observer определяет одно-ко-многим отношение между объектами, и если изменения происходят в объекте – все подписанные на него объекты тут же узнают про это изменение.

Идея проста, объект который мы называем Subject – дает возможность другим объектам, которые реализуют интерфейс Observer, подписываться и отписываться от изменений происходящик в Subject. Когда изменение происходит – всем заинетерсованным объектам высылается сообщение, что изменение произошло. В нашем случае – Subject – это издатель газеты, Observer это мы с вами – те кто подписывается на газету, ну и собсвтенно изменение – это выход новой газеты, а оповещение – отправка газеты всем кто подписался.

Когда используется паттерн:

  1. Когда Вам необходимо сообщить всем объектам подписанным на изменения, что изменение произошло, при этом вы не знаете типы этих объектов.
  2. Изменения в одном объекте, требуют чтобы состояние изменилось в других объектах, при чем количество объектов может быть разное.

Реализация этого паттерна возможно двумя способами:

1. Notification

Notificaiton – механизм использования возможностей NotificationCenter самой операционной системы. Использование NSNotificationCenter позволяет объектам комуницировать, даже не зная друг про друга. Это очень удобно использовать когда у вас в паралельном потоке пришел push-notification, или же обновилась база, и вы хотите дать об этом знать активному на даный момент View.

Чтобы послать такое сообщение стоит использовать конструкцию типа:

Как видим мы создали объект типа NSNotification в котором мы указали имя нашего оповещения: “broadcastMessage”, и собственно сообщили о нем через NotificationCenter.Из кода все более-менее понятно: мы подписываемся на событие, и вызывается метод который задан в свойстве selector.

2. Стандартный метод.

Стандартный метод, это реализация этого паттерна тогда, когда Subject знает про всех подписчиков, но при этом не знает их типа. Давайте начнем с того, что создадим протоколы для Subject и Observer:

Теперь, давайте создадим реализацию Subject:

Ну и куда же без обсерверов:

Собственно – все:) теперь демо-код:

И естественно log:

Пример GitHub:

Паттерн наблюдатель используется, чтобы позволить объекту опубликовать изменения в своем состоянии. Другие объекты, подписанные на исходный объект,  должны быть немедленно уведомлены о любых изменениях в исходном объекте.

Данный код давайет разберем по частям. Для начала  — протокол. Ну тут ничего сложного. Далее следует класс  TestChambers у которого свойство принимает объект класса, который соответсвует вышеописанному протоколу. Также мы используем наблюдатели свойств, о которых мы говорил в статье Наблюдатели свойств в Swift: willSet и didSet.  Далее мы декларируем класс обозревателя, который соответсвует протоколу, методы которого будут вызываться при изменении свойства.

Ну и после запуска тестового  кода мы видим, что сначала срабатывает наблюдатель ДО изменения свойства willSet, а ПОСЛЕ изменения значения свойства didSet.

P.S.

Как по мне, тема NSNotification не раскрыта. В скором времени я планирую опубликовать пример работы NSNotificationCenter.


Метки:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*