Вытащить шаблон наблюдателя в Сервис - PullRequest
1 голос
/ 22 октября 2011

Я большой поклонник паттерна Observer.В нашем коде мы используем его во многих местах, чтобы отделить сервисы друг от друга.Тем не менее, я видел, что он реализован плохо во многих местах, так как есть о чем беспокоиться:

  • Обработка исключений - не хочу, чтобы слушатели бросали исключения во время выполнения.
  • Длительные слушатели, удерживающие основной поток
  • Параллельная модификация списка слушателей, когда мы его перебираем.

Более того, мы повторяем этот код повсюду.В духе СУХОГО я хочу вынести все проблемы Уведомления в единый сервис.Какой-то псевдокод:

Interface NotificationService
   // register the listener to receive notifications from this producer
   registerAsListener (NotificationProducer, NotificationListener)

   // Sends a notification to listeners of this producer
   sendNotification (NotificationProducer, Notification)

   // Sends a notification in a background thread
   sendAsynchNotification (NotificationProducer, Notification)

   // Listener no longer receives messages from this producer
   removeListener(NotificationProducer, NotificationListener)

Мой вопрос таков: теряю ли я исходную точку паттерна наблюдателя, делая это?Я делаю ошибку, вводя другую зависимость с обеих сторон шаблона?И слушатель, и продюсер теперь будут иметь дополнительную зависимость от NotificationService.

Какие у вас взгляды?

1 Ответ

1 голос
/ 23 октября 2011

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

что вы только что реализовали - это (глобальная?) Шина событий. это матрица продюсеров и слушателей. это полезно для многих приложений (см. событие GWT bus ).

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

class ObservedClass implements Observable {
    NotificationService notificationService = new NotificationServiceImpl (this);
    ....
 }

interface NotificationService {
   // register the listener to receive notifications from this producer
   registerAsListener ( NotificationListener)

   // Sends a notification to listeners of this producer
   sendNotification (Notification)

   // Sends a notification in a background thread
   sendAsynchNotification (Notification)

  // Listener no longer receives messages from this producer
  removeListener(NotificationListener)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...