Шаблон дизайну спостерігача схожий на подкаст

Якщо ви слухаєте подкасти, ви вже знайомі з шаблоном Observer. Насправді ви "спостерігач".

Ось визначення для шаблону спостерігача:

Шаблон спостерігача визначає залежність між об'єктами від одного до багатьох, так що коли один об'єкт змінює стан, усі його залежні сповіщаються та оновлюються автоматично.

Давайте розглянемо визначення, пов’язане з подкастами.

Я знайшов цікавий подкаст під назвою чай розробника.

Після натискання кнопки "Підписатися" я зараз перебуваю у їхньому списку передплатників.

Коли чай розробника випустить новий епізод, програма сповістить мене та інших передплатників. Він завантажує новий епізод для нас.

Це саме визначення шаблону спостерігача!

Шаблон спостерігача визначає залежність між об'єктами від одного до багатьох, так що коли один об'єкт змінює стан, усі його залежні сповіщаються та оновлюються автоматично.

Існує взаємозв'язок між чайним подкастом розробника та підписниками.

Коли стан чаю змінюється, наприклад, випускається новий епізод, всі підписники чаю розробника отримують сповіщення та оновлення.

Давайте реалізуємо це в Ruby.

Почніть з простої версії.

Клас Podcast містить список епізодів і має метод додавання_епізоду до списку.

Тоді ми можемо створити подкаст developer_tea і додати до нього епізод №1 так:

Я хочу отримувати сповіщення щоразу, коли виходить новий епізод.

Ми можемо оновити, додавши до списку новий епізод:

І кожного разу, коли я отримую оновлення від developer_tea, я можу продовжувати завантаження останнього епізоду.

Мені подобається слухати developer_tea настільки, що я рекомендую це своєму другові Амбер. Тепер Амбер хоче також підписатися на нього.

Нам потрібно переконатися, що Amber також отримує сповіщення, коли виходить новий епізод:

Гмммм, цей код робить те, що ми хочемо.

Але є проблема.

Кожен раз, коли ми хочемо додати абонента, ми повинні переосмислити клас.

Чи існує спосіб оновлення списку передплатників без необхідності перевизначення класу?

Ми можемо зберігати список передплатників!

Новий клас Podcast зберігає список передплатників за допомогою двох нових методів: одного для додавання абонентів і одного для видалення абонентів. Коли епізод виходить, ми оновлюємо кожного підписника.

На жаль, Амбер не любить подкаст так само, як я, і вирішує скасувати підписку. Ми використовуємо метод remove_subscriber, щоб видалити її зі списку передплатників.

Да! Ви щойно дізналися шаблон спостерігача!

Принцип дизайну за схемою спостерігача.

Шаблон Observer використовує принцип дизайну Loose Coupling:

Прагніть до слабко пов'язаних конструкцій між об'єктами, які взаємодіють.

Клас Podcast не дуже багато знає про своїх передплатників. Він знає лише, що кожен абонент має метод оновлення.

Ця пухка муфта мінімізує залежність між Podcast та його підписниками. Це також забезпечує максимальну гнучкість. Поки у нього є метод оновлення, абонентом може бути що завгодно: людина, група людей, тварина чи навіть машина.

Винос:

  1. Шаблон спостерігача визначає залежність між об'єктами від одного до багатьох, так що коли один об'єкт змінює стан, усі його залежні сповіщаються та оновлюються автоматично.
  2. Принцип дизайну вільної муфти: прагніть до слабко з'єднаних конструкцій між об'єктами, які взаємодіють.

Дякуємо за прочитане Чи існують якісь інші приклади реального життя структури спостерігача, про які ви можете придумати?

Я публікую на sihui.io щотижня.

Підпишіться, щоб ви не пропустили наступну статтю із серії.

Наступного разу ми поговоримо про ...