Образец наблюдателя VS Ссылка на владельца. Что является более правильным? (Джава)

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

Какой подход лучше выбрать? Что выгоднее в разных сценариях, например, многопоточность?

1 ответ

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

Пример использования может быть в плагин-архитектуре:

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

Но гибкость, обеспечиваемая Паттерном Наблюдателя, является обоюдоострым мечом. В примере почтового сервера каждый плагин обрабатывает входящую почту в полной изоляции друг от друга. Это делает невозможным настройку таких правил, как "не отвечать или пересылать спам", потому что наблюдатели не знают друг о друге - и даже если бы они знали, они не знали бы, в каком порядке они выполнены или уже выполнены. Таким образом, чтобы базовый почтовый сервер мог решить эту проблему, он должен иметь ссылки на экземпляры, выполняющие действия spam / reply / forward.

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

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

Я надеюсь, что этот пример дает вам некоторые идеи о плюсах и минусах каждого подхода.

Что касается многопоточности, один подход не выгоден по сравнению с другим.

Другие вопросы по тегам