Альтернатива шаблону наблюдателя, где субъект и наблюдатель представляют одну и ту же сущность? - PullRequest
1 голос
/ 26 июня 2019

У меня в основном есть класс узлов в моем проекте, на который могут подписаться другие узлы.Таким образом, если бы я реализовал паттерн наблюдателя здесь, это повлекло бы за собой то, что этот класс узлов оказался бы субъектом, а также наблюдателем.Я посмотрел на похожие шаблоны дизайна, но не смог найти то, что соответствует моим потребностям.Работает ли здесь паттерн наблюдателя, даже если класс узла должен будет реализовывать интерфейсы как субъекта, так и наблюдателя, или есть более адекватная альтернатива, которая может быть использована?Спасибо.

1 Ответ

0 голосов
/ 26 июня 2019

Здесь работает шаблон наблюдателя

Этот вопрос состоит из двух частей.

Технически возможно, чтобы класс играл роль субъекта и наблюдателя?

Да. В структуре паттерна Observer нет ничего фундаментального, что могло бы этому помешать. Это всего лишь вопрос создания класса Subject, реализующего интерфейс Observer (или его эквивалент), и регистрации экземпляров этого класса. Гамма и др. прямо упоминают эту возможность:

9. Объединение классов Subject и Observer. [...] Это позволяет вам определять объект, который действует как субъект и наблюдатель без множественного наследования ...

Это хорошая идея?

Это будет зависеть от конкретной проблемы дизайна, которую вы пытаетесь решить. Две общие проблемы, которые необходимо решить:

  • Если многие экземпляры узлов в работающей программе являются , а не субъектами, то может быть неоптимальным, чтобы у всех них были неиспользуемые поля для отслеживания их несуществующих наблюдателей. В таком случае стоило бы рассмотреть вопрос о наличии специализированного вида ObservableNode подкласса. См. Пример ObservableList.

  • Некоторая часть кода должна отвечать за избежание циклов в последовательности уведомлений наблюдателя.

...