С шаблоном Observer ваши классы, которые наблюдают, не должны показывать свои реализации.Часто ваш класс, который уведомляет другие классы, будет иметь свой собственный связанный интерфейс для реализации этими другими классами.
public interface Observer
{
public void handleSomeEvent(Object someObjectOfImportance);
}
public class Observable
{
public void register(Observer observer);
}
Любой класс может реализовать интерфейс Observer
и зарегистрировать себя, не раскрывая никаких деталей реализации.Он показывает, что он реализует интерфейс, но это не определяет , как он реализует его.В качестве альтернативы вы можете предоставить анонимную реализацию.
public class SomeObserverImplementation implements Observer
{
public void handleSomeEvent(Object someObjectOfImportance)
{
// I can do whatever I want here
}
}
Обновление Если вы обеспокоены тем, что ваш класс теперь предоставляет новый интерфейс , есть несколько способов работывокруг него.Одним из них является создание анонимной реализации.Другой способ заключается в том, что у вас может быть закрытый внутренний класс, который реализует интерфейс Observable.
public class IDontWantOthersToKnowIObserve
{
private class HiddenObserver implements Observer
{
public void handleSomeEvent(Object someObjectOfImportance)
{
...
}
}
... in some method ...
theObservable.register(myHiddenObserver);
}
Чтобы использовать анонимную реализацию:
theObservable.register(new Observer()
{
public void handleSomeEvent(Object someObjectOfImportance)
{
// ...
}
});