Наблюдатель / наблюдаемый шаблон не требует определенных классов из библиотеки Java.Все эти классы реализуют некоторые части шаблона наблюдателя для вас.Вы можете сделать свои собственные классы наблюдаемыми, управляя наблюдателями самостоятельно.Обратите внимание, что следующее не объясняет, как заставить один поток ждать другого - это другая проблема.
Вы можете написать интерфейс слушателя следующим образом:
public interface FooListener {
void fooChanged(int newValue);
}
Вы можете управлятьнабор слушателей в таком классе:
public class Foo {
private int value = 0;
private final Collection<FooListener> listeners = new ArrayList<FooListener>();
public void addFooListener(FooListener listener) {
listeners.add(listener);
}
public void removeFooListener(FooListener listener) {
listeners.remove(listener);
}
public void change(int newValue) {
value = newValue();
for (FooListener l : listeners) {
l.fooChanged(newValue);
}
}
public int getValue() {
return value;
}
}
Вот простой пример реализации слушателя.
public class PrintingFooListener implements FooListener {
public void fooChanged(int newValue) {
System.out.println("New Foo value: " + newValue);
}
}
Следующая программа выдаст New Foo value: 10
.
public static void main(String[] args) {
PrintingFooListener myListener = new PrintingFooListener();
Foo myFoo = new Foo();
foo.addFooListener(myListener);
foo.change(10);
}