Фильтрация трансляции по шаблону наблюдателя - PullRequest
0 голосов
/ 09 июня 2011

Старший программист хочет использовать мой класс шаблонов наблюдателя для обновления другого объекта при изменении субъекта . Теперь субъект будет меняться, получая сообщения с различной семантикой.Допустим, есть два типа сообщений, мА и мБ, и у меня есть три наблюдателя oX, oY и oZ.

  • oX хочет знать о mA
  • oY хочет знатьо mB
  • oZ хочет знать о mA и mB

Он говорит мне иметь некоторую логику (если-еще) в предметной области, говоря, что

  • если прибывает мА, отправьте его в oX и oZ
  • если прибудет мБ, отправьте его в oY и oZ

Мне это кажется подозрительным, потому что это делает предметзнать о конкретных типах своих наблюдателей (я использую абстрактный класс для широковещательной передачи наблюдателям)

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

Ответы [ 3 ]

1 голос
/ 09 июня 2011

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

1 голос
/ 09 июня 2011

Вы правы.Это знание должно быть у какого-то диспетчера.Это может варьироваться от очень простого, в данном случае это в основном Медиатор, до чего-то более сложного, и в этом случае вы хотите раскрыть книги Дуга Шмидта и взглянуть на некоторые из его решений (например, Reactor или Proactor).

Другой вариант - поддержка разных слушателей.Например, у меня может быть прослушиватель жизненного цикла для мастера, и в этом случае я буду вызывать onStart (), onNext () и onFinish ().Тогда логика отсутствует, другая сторона просто обращает внимание на то, что ей интересно, или запускает свое поведение в зависимости от состояния удаленного события.

Вы всегда можете вывести Observer наизнанку, используя Command.Если кто-то говорит вам «эй, когда x случается, если y истинно, делайте z», у вас может быть команда, которая имеет это, если y делает z внутри, и вы просто запускаете ее, когда происходит x (вызывая execute ()).

0 голосов
/ 12 мая 2015

Вы можете изменить сигнатуру метода notify (), который используется субъектом для уведомления наблюдателей. Вы можете иметь все свои типы событий в перечислении, а затем использовать его в качестве параметра notif (тип EventType), а затем в каждом наблюдателе вы можете написать простое выражение if и выполнить фильтрацию.

Предположим, что ObserveTemp и ObserveHumidity являются двумя наблюдателями для предметной комнаты, а затем, если изменится существо, вы можете сделать это. наблюдатель.notify (Event_Temp) и в случае изменения влажности вы можете сделать уведомление (Event_Humidity). В Observers, когда вы предоставляете реализацию для метода notify, вы можете изменить сигнатуру метода notify (), который используется субъектом для уведомления наблюдателей. Вы можете иметь все свои типы событий в перечислении, а затем использовать его в качестве параметра notif (тип EventType), а затем в каждом наблюдателе вы можете написать простое выражение if и выполнить фильтрацию.

Предположим, что ObserveTemp и ObserveHumidity являются двумя наблюдателями для предметной комнаты, а затем, если изменится существо, вы можете сделать это. наблюдатель.notify (Event_Temp) и в случае изменения влажности вы можете сделать уведомление (Event_Humidity). В ObserveTemp, когда вы предоставляете реализацию для метода уведомления, вы можете сделать, как показано ниже.

public void notify (Event_Type type)    {
    if (type == Event_temp){
        //do processing...
    }
}

надеюсь, что это поможет, в этом случае субъекту не нужно знать о том, какие классы концептуально реализуют Observer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...