В настоящее время я пытаюсь разобрать некоторую тесную связь между моделью данных и пользовательским интерфейсом в приложении путем введения шаблона MVC. По сути, это означает информирование модели о связанных представлениях, чтобы они информировались всякий раз, когда изменяются свойства внутри модели.
Модель данных представлена вложенной структурой:
Model
- Node
- Leaf
- Leaf
- Node
- Leaf
Каждый элемент наследуется от общего абстрактного базового класса (StructuredNode).
Проблема, о которой я думал, заключается в том, что наблюдатели должны иметь возможность подписаться на Модель (и только на Модель), но каждый элемент должен иметь возможность отправлять уведомления об изменениях. Это может быть достигнуто двумя способами - либо уведомления направляются вверх по иерархии, пока они не достигают Модели, где они доставляются к наблюдателям, либо путем реализации уведомлений в базовом классе со статическим списком наблюдателей, как в этом примере:
public abstract class Base {
private static Map<IObserver> observers;
protected synchronized void internalSubscribe(final IObserver observer) {
observers.add(observer);
}
protected synchronized void notifyObservers(final Base obj) {
for (IObserver observer : observers)
observer.changed(obj);
}
// .. other base class operations
}
В этой реализации только Model будет предлагать открытый метод подписки, который внутренне делегирует защищенному методу internalSubscribe базового класса. В то же время каждая производная базового класса может отправлять уведомление об изменении, например:
// Perform some operations that change the object's internal state
// ...
// Then notify all observers
notifyObservers(this);
Это довольно хорошая или скорее плохая практика (с использованием статического списка наблюдателей)? Есть мнения по этому поводу? Есть ли альтернативные решения?