Реализация паттерна «Наблюдатель» в простом коде Java

Реализация паттерна "Наблюдатель" в простом коде JavaЯзык Jаvа обеспечивает готовую для использования реализацию паттерна «Наблю­датель». Разработчики легко могут реализовать этот паттерн с помощью интерфей­са Observer и расширения класса Observable.

Первое, что нам необходимо сделать — это создать класс, расширяющий класс Observable. В следующем примере когда новостное агентство оповещает несколько типов подпис­чиков в момент публикации нового материала. Подписчик может добавить соб­ственное поведение после получения обновления.

Следующий код программы обеспечивает интерфейс для «публикации» класса Observable.

Далее нам необходимо создать класс для наблюдения за изменениями NewsAgency. Наблюдатель должен реализовывать интерфейс Observer, как показана в следующем примере кода:

Наконец, вы должны зарегистрировать наблюдатель RadioChannel на наблюда­емом NewsAgency и создать несколько новостных материалов.

Вывод в консоли будет примерно следующим:

Заметьте, что вы можете регистрировать много наблюдателей на newsAgency и получать с их помощью обновления. Например, можно зарегистрировать наблю­датель TVChannel или InternetNewsChannel для получения обновлений от newsAgency.

Помимо этого, у вас могут быть другие Publisher (или любые иные типы объектов, реализующие Observable }, выдающие обновления любому наблюдателю, пожела­вшему зарегистрировать себя для получения новостей. Эти наблюдатели могут осуществлять проверку типа Observable и обрабатывать обновления в соответствии с источником.

Один существенный недостаток подобной реализации паттерна «Наблюдатель» в том, что нам приходится расширять класс Observable. Это принуждает использо­вать иерархию классов, которая может быть нежелательной. Поскольку вы не можете расширить сразу несколько классов в мире единичного наследования языка Jаvа, такой способ реализации паттерна «Наблюдатель» ограничивает про­ектирование наследования.

Вы не можете добавить поведение класса Observable к существующему классу, который уже расширяет другой базовый класс, ограни­чивая тем самым потенциал его многократного использования. Но не отчаивайтесь. Вы можете реализовать паттерн «Наблюдатель» «вруч­ную», без использования внутренних интерфейсов Observer и Observablе.