Здесь работает шаблон наблюдателя
Этот вопрос состоит из двух частей.
Технически возможно, чтобы класс играл роль субъекта и наблюдателя?
Да. В структуре паттерна Observer нет ничего фундаментального, что могло бы этому помешать. Это всего лишь вопрос создания класса Subject, реализующего интерфейс Observer (или его эквивалент), и регистрации экземпляров этого класса. Гамма и др. прямо упоминают эту возможность:
9. Объединение классов Subject и Observer. [...] Это позволяет вам определять объект, который действует как субъект и наблюдатель без множественного наследования ...
Это хорошая идея?
Это будет зависеть от конкретной проблемы дизайна, которую вы пытаетесь решить. Две общие проблемы, которые необходимо решить:
Если многие экземпляры узлов в работающей программе являются , а не субъектами, то может быть неоптимальным, чтобы у всех них были неиспользуемые поля для отслеживания их несуществующих наблюдателей. В таком случае стоило бы рассмотреть вопрос о наличии специализированного вида ObservableNode
подкласса. См. Пример ObservableList
.
Некоторая часть кода должна отвечать за избежание циклов в последовательности уведомлений наблюдателя.