Java: Какие у меня есть варианты уведомления о событиях в моем собственном API? - PullRequest
3 голосов
/ 08 февраля 2011

Предположим, у вас есть API, который вы написали, который собирает данные в режиме реального времени в независимый поток . Доступ к данным является потокобезопасным и через интерфейс. Например. getData(), который не блокирует и предоставляет самую последнюю информацию. Этот API используется в ряде приложений; некоторые с графическим интерфейсом, другие консольные программы.

Какие варианты у вас есть, чтобы уведомить ваше приложение об обновлении данных? Мы определенно не хотим, чтобы API зависел от приложения, поэтому мы не хотим fireTableDataChanged() или что-то подобное от API. (В нашем приложении с графическим интерфейсом мы будем вызывать fireTableDataChanged() и т. Д. После того, как API уведомит нас или мы посмотрим на API.)

Большое спасибо!

Ответы [ 3 ]

3 голосов
/ 08 февраля 2011

Один из вариантов - написать собственный класс производителя событий.

  • IEventListener
  • IEventProducer , EVENT>
  • EventProducer , EVENT> реализует IEventProducer

IEventListener реализован наблюдателями. У него есть метод для получения события.

IEventProducer реализуется любым наблюдаемым через EventProducer. У него есть методы для добавления и удаления слушателей.

EventProducer является поточно-ориентированным. У него есть метод для отправки событий в CopyOnWriteArrayList слушателей. Он ловит и регистрирует любые исключения, выдаваемые слушателями. Он также предоставляет методы для добавления и удаления слушателей.

Тогда любой наблюдаемый класс может реализовать IEventProducer через внутренний EventProducer.

Если вы пытаетесь поддерживать два типа слушателей в одном и том же классе, стирание типов потребует, чтобы вы называли методы добавления / удаления слушателей по-разному для разных слушателей.

2 голосов
/ 08 февраля 2011

Обычно у вас есть два варианта.

1) Опросите API, чтобы узнать, есть ли у него новые данные.
2) Получите API, чтобы уведомить вас, когда у него появятся новые данные.* Получение API, чтобы уведомить вас, может быть с паттерном Observer.Обратите внимание, что вам не нужно использовать Observable и Observer, вы можете написать свои собственные интерфейсы.В основном это работает следующим образом:

  • Наблюдаемая вещь (ваш API) имеет список наблюдателей, которые реализуют некоторый интерфейс наблюдателя / слушателя.Он должен поддерживать наблюдателей, запрашивающих добавление себя в этот список.
  • Объект, выполняющий наблюдение / прослушивание, реализует этот интерфейс и вызывает API для добавления себя в список наблюдателей.
  • Когда вещьНаблюдение обновляет свой статус (т.е. имеет новые данные), просматривает список наблюдателей и уведомляет их.
2 голосов
/ 08 февраля 2011

Вы можете взглянуть на Наблюдаемый и Наблюдатель .Я не использовал их лично, и, глядя на API, я не совсем уверен, что мне это нужно.По сути ваши наблюдаемые объекты данных вынуждены расширяться от класса Observable.Классы, заинтересованные в данных, должны реализовывать интерфейс Observer и регистрироваться в объекте данных.Этот API существует с 1.0, не является универсальным, и я думаю, что он неуклюжий.Однако это единственный шаблон Observer / Observable в библиотеке Java, который я знаю.

...