Паттерн наблюдатель python примеры

Observer method – Python Design Patterns

The observer method is a Behavioral design Pattern which allows you to define or create a subscription mechanism to send the notification to the multiple objects about any new event that happens to the object that they are observing. The subject is basically observed by multiple objects. The subject needs to be monitored and whenever there is a change in the subject, the observers are being notified about the change. This pattern defines one to Many dependencies between objects so that one object changes state, all of its dependents are notified and updated automatically.

Problem Without using Observer Method

Imagine you want to create a calculator application that has different features such as addition, subtraction, changing base of the numbers to hexadecimal, decimal, and many other features. But one of your friends is interested in changing the base of his favorite number to Octal base number and you are still developing the application. So, what could be the solution to it? Should your friend check the application daily just to get to know about the status? But don’t you think it would result in a lot of unnecessary visits to the application which were definitely not required. Or you may think about that each time you add the new feature and send the notification to each user. Is it OK? Sometimes yes but not every time. Might be some users get offended by a lot of unnecessary notifications which they really don’t want.

Читайте также:  Access file from javascript

Solution using Observer Method

Let’s discuss the solution to the above-described problem. Here comes the object Subject into the limelight. But it also notifies the other objects also that’s why we generally call it Publisher. All the objects that want to track changes in the publisher’s state are called subscribers.

Источник

Шаблон проектирования Наблюдатель(Observer) в Python

Шаблон проектирования Наблюдатель (Observer) в Python — это поведенческий шаблон проектирования, в котором объекты представлены как наблюдатели, ожидающие запуска события. Когда запускается новое событие, несколько наблюдателей перехватывают эти события.

Источник события (или объект) присоединяется к субъекту. Всякий раз, когда изменение выполняется в субъекте, наблюдатель уведомляет об этом. Он следует подходу «один ко многим» между объектами, так что одно изменение в субъекте будет отражаться во всех его взаимосвязях и автоматически обновляться.

Давайте разберемся с приведенной выше концепцией на реальном примере.

Если мы подписчики газет или журналов, нам не нужно идти в магазин, чтобы узнать новости. Мы получаем газету дома. Если доступно новое обновление, издатель отправляет его прямо на наш почтовый ящик сразу после публикации.

Издатель обладает полной информацией о подписчике. Подписчик может отменить подписку, если она не соответствует его интересам.

Проблема без использования шаблона проектирования Observer

Представьте, что клиент заинтересован в определенном продукте (предположим, новом мобильном телефоне), который еще не выпущен. Но очень скоро он будет доступен в магазине, покупатель мог бы регулярно посещать магазин и проверять наличие. Но эти визиты были бы бессмысленны, потому что товар все еще в пути.

Вместо этого магазин мог бы отправить несколько писем, но это будет надоедать тем, кому новинка не интересна.

Здесь возникают две проблемы: либо клиент тратит свое время на проверку доступности продукта, либо электронные письма могут беспокоить, уведомляя не того клиента.

Читайте также:  Python pip get package version

Решение с использованием метода наблюдения

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

В методе наблюдателя класс издателя состоит из метода подписки, так что каждый объект может подписаться и отказаться от подписки на событие, происходящее этим издателем. Этот механизм может показаться немного сложным, но он не совсем так, как кажется. Механизм издатель-подписчик состоит из следующих методов.

  • Список ссылок на объекты-подписчики.
  • Различные общедоступные методы предоставляют возможность добавлять и удалять подписчика из списка.

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

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

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

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

Указание методов подписки

Реализация шаблона Observer

Давайте разберем следующий код фрагмента.

import threading import time import pdb class Downloader_Class(threading.Thread): def run(self): print('Current Task Downloading') for i in range(1, 6): self.i = i time.sleep(2) return 'hello world' class Working_Class(threading.Thread): def run(self): for i in range(1, 6): print('Working_Class running: %i(%i)' %(i, dow.i)) time.sleep(1) dow.join() print('Task Completed') dow = Downloader_Class() dow.start() time.sleep(1) wor = Working_Class() wor.start() wor1 = Working_Class() wor1.start() t3 = Working_Class() t3.start()
Current Task Downloading Working_Class running: 1(1) Working_Class running: 1(1) Working_Class running: 1(1) Task CompletedTask CompletedTask Completed Working_Class running: 2(5) Working_Class running: 2(5) Working_Class running: 2(5) Task Completed Task Completed Working_Class running: 3(5) Task Completed Working_Class running: 3(5) Working_Class running: 3(5) Task CompletedTask Completed Working_Class running: 4(5)Working_Class running: 4(5)Task Completed Working_Class running: 4(5) Task CompletedTask Completed Working_Class running: 5(5) Working_Class running: 5(5) Task Completed Working_Class running: 5(5) Task Completed Task Completed Task Completed

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

Читайте также:  Php post from select option

Преимущества шаблона Наблюдатель

Ниже приведены некоторые преимущества шаблона проектирования наблюдателя.:

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

Недостатки Observer

Ниже приведены некоторые недостатки шаблона проектирования наблюдателя:

  • Метод наблюдателя имеет риск реализации. Если он не будет реализован тщательно, это приведет к большой сложности кода.
  • Основной недостаток шаблона проектирования наблюдателя в том, что подписчики уведомляются в случайном порядке.
  • Существует также проблема утечки памяти в шаблоне проектирования наблюдателя из-за явной регистрации и отмены регистрации наблюдателя.

Применимость

  • Метод наблюдателя следует использовать, если есть несколько зависимостей от состояния одного объекта. Это следует за зависимостями один ко многим, что означает, что любое изменение состояния объекта будет отражать прикрепленный объект (в случае слабой связи).
  • Этот метод используется для отправки уведомлений, электронных писем, сообщений и т. д. Когда мы подписываемся на какой-либо конкретный веб-сайт, он уведомляет нас о любых новых событиях на этом веб-сайте.
  • Объект должен быть плотно соединен. Если в объектах существует слабая связь, изменение одного состояния отразится на другом объекте.
  • Список подписчиков является динамическим, что означает, что подписчики могут присоединиться и отказаться от подписки, когда захотят.

Источник

Оцените статью