Mówiąc bardzo prosto (ponieważ pozostałe odpowiedzi i tak odnoszą się do wszystkich oficjalnych wzorców projektowych, spójrz na nie, aby uzyskać dalsze szczegóły):
Jeśli chcesz mieć klasę monitorowaną przez inne klasy w ekosystemie twojego programu, mówisz, że chcesz, aby klasa była obserwowalna. Tzn. Mogą wystąpić pewne zmiany w jego stanie, które chciałbyś nadać do reszty programu.
Aby to zrobić, musimy wywołać jakąś metodę. Nie chcemy, aby klasa Obserwowalna była ściśle powiązana z klasami zainteresowanymi jej obserwowaniem. Nie ma znaczenia, kim jest, o ile spełnia określone kryteria. (Wyobraź sobie, że to stacja radiowa, nie ma znaczenia, kto słucha, dopóki mają dostrojone radio FM na swojej częstotliwości). Aby to osiągnąć, korzystamy z interfejsu, zwanego Obserwatorem.
Dlatego klasa Observable będzie miała listę obserwatorów (tj. Instancje implementujące metody interfejsu obserwatora, które możesz mieć). Ilekroć chce coś transmitować, po prostu wywołuje metodę na wszystkich obserwatorach, jeden po drugim.
Ostatnią rzeczą do zamknięcia puzzli jest to, w jaki sposób klasa Obserwowalna będzie wiedzieć, kto jest zainteresowany? Tak więc klasa Obserwowalna musi oferować jakiś mechanizm pozwalający Obserwatorom zarejestrować swoje zainteresowanie. Metoda taka jak addObserver(Observer o)
wewnętrzna dodaje obserwatora do listy obserwatorów, dzięki czemu gdy dzieje się coś ważnego, przechodzi przez listę i wywołuje odpowiednią metodę powiadamiania interfejsu obserwatora każdej instancji na liście.
Może się okazać, że w wywiadzie, że nie poprosi o wyraźnie java.util.Observer
i java.util.Observable
tylko o ogólnej koncepcji. Ta koncepcja jest wzorcem projektowym, który Java zapewnia wsparcie bezpośrednio po wyjęciu z pudełka, aby pomóc Ci szybko go zaimplementować, gdy jest to potrzebne. Proponuję więc, abyś zrozumiał pojęcie, a nie rzeczywiste metody / klasy (które możesz sprawdzić, kiedy ich potrzebujesz).
AKTUALIZACJA
W odpowiedzi na Twój komentarz rzeczywista java.util.Observable
klasa oferuje następujące udogodnienia:
Prowadzenie listy java.util.Observer
instancji. Nowe instancje zainteresowane powiadomieniem można dodawać addObserver(Observer o)
i usuwać deleteObserver(Observer o)
.
Utrzymywanie stanu wewnętrznego, określanie, czy obiekt zmienił się od czasu ostatniego powiadomienia obserwatorów. Jest to przydatne, ponieważ oddziela część, w której mówi się, że Observable
uległa zmianie, od części, w której powiadamiasz o zmianach. (Np. Jest to użyteczne, jeśli dzieje się wiele zmian i chcesz powiadomić tylko na końcu procesu, a nie na każdym małym kroku). Odbywa się to poprzez setChanged()
. Więc po prostu zadzwoń, gdy zmienisz coś na Observable
i chcesz, żeby reszta w Observers
końcu o tym wiedziała.
Powiadamianie wszystkich obserwatorów o Observable
zmianie stanu określonego. Odbywa się to poprzez notifyObservers()
. To sprawdza, czy obiekt rzeczywiście się zmienił (tj. setChanged()
Wykonano wywołanie ) przed kontynuowaniem powiadomienia. Istnieją 2 wersje, jedna bez argumentów i jedna z Object
argumentami, na wypadek gdybyś chciał przekazać dodatkowe informacje wraz z powiadomieniem. Wewnętrznie dzieje się tak, że po prostu iteruje listę Observer
instancji i wywołuje update(Observable o, Object arg)
metodę dla każdego z nich. Mówi to, Observer
który obiekt podlegał obserwacji, który się zmienił (możesz obserwować więcej niż jeden), a także dodatkowe, Object arg
które potencjalnie mogą zawierać dodatkowe informacje (przekazywane) notifyObservers()
.