Wzorzec obserwatora
Z Wikipedii
Wzorzec obserwatora (ang. observer pattern) – wzorzec należący do grupy wzorców czynnościowych. Jest wykorzystywany w sytuacji, kiedy mamy do czynienia z pewnym modelem danych oraz kilkoma jego reprezentacjami i chcemy zachować spójność między nimi. Przykładem mogą być tu dane statystyczne oraz ich reprezentacje w postaci np. arkusza danych, wykresu słupkowego, wykresu kołowego, itp.
Przy zastosowaniu wzorca obserwatora oddzielamy logiczną strukturę danych od jej reprezentacji, unikając trwałych połączeń między klasami i umożliwiając tym samym ponowne wykorzystanie poszczególnych klas. Jednocześnie unikamy nieczytelnego i zbyt mocno rozbudowanego kodu w pojedynczej klasie.
Spis treści |
[edytuj] Inne nazwy
- Observer
- Listener
[edytuj] Elementy
Obserwowany
- definiuje interfejs zapewniający możliwość rejestracji i wyrejestrowywania obserwatorów.
Obserwator
- definiuje interfejs umożliwiający uaktualnianie stanu obiektu.
ObserwowanyKonkretny
- implementuje interfejs Obserwowany
- przechowuje odwołania do wszystkich swoich obserwatorów
- zajmuje się informowaniem ich o zmianie stanu wewnętrznego
ObserwatorKonkretny
- zna ObserwowanegoKonkretnego
- implementuje interfejs pozwalający ObserwowanemuKonkretnemu informować o zmianach stanu
[edytuj] Działanie
Kiedy zmienia się stan obiektu ObserwowanyKonkretny, wywołana zostaje metoda powiadomObserwatorow(). Jej zadaniem jest przejście całej listy zarejestrowanych Obserwatorów i wywołania metody uaktualnij() w każdym z nich. Kiedy zostaje wywołana metoda uaktualnij() w ObserwatorzeKonkretnym następuje odczytanie stanu ObserwowanegoKonkretnego poprzez wywołanie jego metody pobierzStan(). Na jego podstawie wykonywana zostaje aktualizacja stanu Obserwatora.
[edytuj] Przykładowy kod
[edytuj] Kod w języku Java
Obserwowany.java:
public interface Obserwowany { public void dodajObserwatora( Obserwator obserwator ); public void usunObserwatora( Obserwator obserwator ); public void powiadomObserwatorow(); }
Obserwator.java:
public interface Obserwator { public void uaktualnij(); }
ObserwowanyKonkretny.java:
import java.util.List; import java.util.ArrayList; public class ObserwowanyKonkretny implements Obserwowany { protected List<Obserwator> obserwatorzy = new ArrayList<Obserwator>(); private StanObserwowanego stanObserwowanego; public void dodajObserwatora( Obserwator obserwator ) { obserwatorzy.add( obserwator ); } public void powiadomObserwatorow() { Iterator<Obserwator> it = obserwatorzy.iterator(); while( it.hasNext() ) { it.next().uaktualnij(); } } public void usunObserwatora( Obserwator obserwator ) { obserwatorzy.remove( obserwator ); } public StanObserwowanego pobierzStan() { return stanObserwowanego; } }
ObserwatorKonkretny.java:
public class ObserwatorKonkretny implements Obserwator { private StanObserwatora stanObserwatora; private ObserwowanyKonkretny obserwowany; public ObserwatorKonkretny( ObserwowanyKonkretny obserwowany ) { obserwowany = obserwowany; } public void uaktualnij() { StanObserwowanego stanObserwowanego = obserwowany.pobierzStan(); // Na podstawie stanuObserwowanego ustawia stanObserwatora } }
[edytuj] Modyfikacje
Powyższy opis nie jest pełnym opisem wzorca Obserwator. W zależności od potrzeb stosować można najróżniejsze jego modyfikacje:
- ObserwowanyKonkretny jest przekazywany do ObserwatoraKonkretnego nie jako parametr konstruktora, ale przy użyciu oddzielnej metody np. ustawObserwowanego()
- ObserwatorKonkretny w ogóle nie zna ObserwowanegoKonkretnego, a jego stan przekazywany jest podczas wywołania metody uaktualnij() jako jej parametr
[edytuj] Źródła
- 1. E. Gamma, R. Helm, R. Johnson, J. Vlissides - Inżynieria Oprogramowania. Wzorce projektowe. [tłum. J. Jabłoński] WNT, Warszawa, 2005. ISBN 83-204-3041-0.