2012-06-23 4 views
1

В наблюдателе Паттерн наблюдатель уведомляет слушатель, как правило, вызывая на каждом какой-либо способе, как:Как реализовать вопреки шаблону наблюдателя в java?

OnSomethingUpdated(Object) { 
.... 

В этом случае мы имеем соединение: наблюдатель должен сделать какую-то операцию с каждым слушателем. Когда я хотел бы изменить Observer или Listener по наследованию или попытаться извлечь абстрактный суперкласс для упрощения логики Observer (или Listener), это затрудняет распространение сообщений, я получаю код спагетти. Я думаю, что должен существовать какой-то способ развязывания бизнес-логики работы Observer от логики распространения сообщений слушателям. Может быть лучше наоборот - слушатели должны проверить несколько пулов сообщений. Существует ли подобный шаблон? Спасибо.

ответ

0

Вы можете добавить Business Delegate между или простым фасадом.

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

1

В observer pattern, А.Н. Observerрегистры с Observable субъекта. Метод onSomethingUpdated()Observer вызывается Observable, который уведомляет всех слабосвязанных слушателей. Существует связанный пример here.

observer pattern

1

Вы, вероятно, не понравится этот ответ очень много, но я все равно сказать: наследование не для повторного использования кода. Схема наблюдателя не должна приводить к плотной связи - это должно привести к развязке! Поэтому, если вы получаете код спагетти вокруг своих наблюдателей/слушателей, когда вы извлекаете абстрактные базовые классы или подклассы, это потому, что вы не должны использовать наследование .

Там, я это сказал.

3

Слушатель должен быть на самом деле интерфейс:

interface MyListener { 
    void onSomethingUpdated(Object eventData); 
} 

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

Посмотрите here, как реализовать этот шаблон в Java.

Теперь, чтобы отделить тему от распространения сообщения, я предлагаю вам взглянуть на шаблон mediator.

Смежные вопросы