Как упоминалось ранее, в Java нет делегатов и событий , которые есть в C #. Но, учитывая, что это «обобщенная» реализация шаблона Observer (GoF), вы можете реализовать его самостоятельно.
В есть примеры страницы википедии о том, как реализовать шаблон с java.util.Observable
и java.util.Observer
. Общая идея состоит в том, чтобы позволить классам, которые реализуют Observer
, подписаться на Observable
класс.
Я обычно использую свою собственную реализацию, так как это чертовски легко сделать, поскольку вам нужно только создать интерфейс, объявляющий методы, которые "наблюдаемый" класс вызывает для своих зарегистрированных "наблюдателей". Вот простой пример наблюдаемого класса, который может зарегистрировать SimpleObserver
объектов и выполнить с ними какое-то событие:
public class MyObservableClass {
List<SimpleObserver> observers = new ArrayList<SimpleObserver>();
/**
* Registers the observer
*/
public void addObserver(SimpleObserver observer) {
observers.add(observer);
}
/**
* Removes the registered observer (to be nice towards the
* garbage collector).
*/
public void removeObserver(SimpleObserver observer) {
observers.remove(observer);
}
/**
* Notifies the observers with the given data
*/
private void notifyObservers(String data) {
for(SimpleObserver o : observers) {
o.onEvent(data);
}
}
public void doSomething() {
// Do some stuff
String data = "Waffles and pwnies";
// Notify the observers that something happened.
notifyObservers(data)
}
}
… а вот простой интерфейс наблюдателя.
public interface SimpleObserver {
void onEvent(String data);
}
Это может показаться немного сложным, но преимущество в том, что классу Observable не нужно знать, какие именно объекты его «слушают» (именно поэтому наблюдателей иногда называют * 1028). * слушатели ). Это обеспечивает четкое разделение проблем между ними обоими. Наблюдатели должны зарегистрироваться для наблюдения.
Единственная «ошибка», о которой я могу подумать, это утечка памяти, которую этот шаблон может вызывать даже в управляемой памяти среде, такой как Java. Это из-за «эталонных островков» между Observers и Observables, которые запутают сборщик мусора и не попытаются удалить объекты из памяти. всегда хорошая идея удалить неиспользуемых наблюдателей .