Основные шаблоны проектирования для всех уровней разработки программного обеспечения.

Я пишу серию постов о моих любимых шаблонах проектирования программного обеспечения.

Не знаете, что такое шаблоны проектирования программного обеспечения? Посмотрите мой первый пост в этой серии для краткого ознакомления.

Плагин (партнерские ссылки)

Некоторые из моих любимых книг на эту тему. Классический справочный текст, опубликованный в 1994 году, Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения, написанный бандой четырех. Шаблоны проектирования Head First — хорошая альтернатива первой книге шаблонов проектирования. Для более разнообразного опыта я бы рекомендовал Шаблоны архитектуры корпоративных приложений и Шаблоны корпоративной интеграции.

Шаблон наблюдателя

Наблюдатель — это поведенческий программный паттерн для сообщения об изменениях состояния.

Связь может происходить между разными объектами в одной системе или между узлами, работающими на разных машинах. Он часто используется для реализации распределенных систем, управляемых событиями, публикации/подписки и прослушивания событий.

Когда части моей программы нужно знать состояние другой части моей системы, я обычно спрашиваю или иду проверять.

Например, предположим, что у нас есть этот класс Person в python. Чтобы узнать, каково настроение конкретного человека, мы должны сослаться на этот объект и получить доступ к свойству настроения.

Теперь предположим, что у меня есть этот класс MoodRing, которому нужно знать состояние настроения человека, чтобы знать, какой цвет отображать.

Чтобы использовать эти классы, вы можете написать код драйвера, чтобы собрать все вместе. Два подводных камня этой конструкции:

1) Мы должны попросить кольцо проверить настроение человека, что неудобно. Кажется, ни один класс в системе не несет явной ответственности за указание обновления кольца, и я не хочу полагаться на свой код драйвера для этого.

2) Кольцо должно хранить ссылку на человека целиком, это больше, чем необходимо, потому что кольцо заботится только о настроении человека.

Паттерн наблюдателя меняет направление коммуникации.

Скажи не спрашивай.

Иногда лучше, когда о чем-то говорят, чем приходится спрашивать.

В этом случае лучше кольцу сообщать о смене настроения, чем кольцу постоянно спрашивать человека. Настроение человека могло вообще не измениться, что делало любые дополнительные циклы проверки неэффективными.

Давайте переработаем шаблон наблюдателя в наш существующий код.

Мы объявили новый абстрактный класс PersonListener для определения интерфейса, который должен реализовать слушатель.

Класс Person был превращен в наблюдателя. Он поддерживает список слушателей, и мы добавили метод, позволяющий клиентам добавлять слушателей. Когда настроение человека меняется, теперь он несет ответственность за передачу этого изменения всем своим слушателям. Это происходит путем вызова метода handle_mood для каждого слушателя.

Код MoodRing упрощен! Теперь ему нужно только отслеживать свой собственный цвет и обновлять этот цвет, когда он сообщает об этом через handle_mood.

Код драйвера обеспечивает значительно улучшенный опыт кодирования. Я просто создаю экземпляры своих объектов и регистрирую кольцо, чтобы наблюдать за человеком. Обратите внимание, что когда настроение человека меняется, кольцо также обновляет свое состояние.

Мы не рассматривали удаление слушателей. Я оставлю это вам в качестве упражнения.

В качестве бонуса обратите внимание на слабые референсы для слушателей.

Важно избегать утечек памяти!

Как только вы получите четкое представление об наблюдателе, углубитесь в изучение систем, управляемых событиями, которые построены с его использованием!

Удачного кодирования!