Wzorzec Observer jest wzorcem operacyjnym. Definiuje relację jeden do wielu między obiektami, gdzie obiekty obserwujące zostają powiadomione o zmianie stanu obiektu obserwowanego. Obiekty obserwujące nie muszą wiedzieć, że istnieją inne obiekty obserwujące to samo, oraz same mogą decydować czy chcą być powiadamiane o zmianach stanu czy też nie.
Aby zrealizować takie zadanie wymagane jest utworzenie dwóch interfejsów: Obserwator i Obserwowany. Pierwszy ma zdefiniowaną metodę, która jest wykonywana gdy obiekt obserwowany zmieni stan. Interfejs obiektu obserwowanego musi posiadać trzy metody: getter i setter dla obserwatorów oraz metodę powiadamiającą wszystkich zarejestrowanych obserwatorów o zmianie stanu.
Wyobraźmy sobie że chcemy dostawać informację o każdej zmianie w serwisie WWW. Za wyświetlanie danych na stronie jest odpowiedzialna klasa SiteRenderer, która metodą updateContent dodaje nowy materiał do treści strony.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class SiteRenderer { // ... public void updateContent() { //kod aktualizujący wygląd witryny } // ... } |
Chcemy być informowani o zmienie treści serwisu, więc klasa SiteRenderer będzie naszym obserwowanym obiektem. Tworzymy dwa interfejsy: Obserwator i Obserwowany:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public interface Obserwator { public void aktualizuj(); } public interface Obserwowany { public void dodajObserwatora(Obserwator o); public void usunObserwatora(Obserwator o); public void powiadomWszystkich(); } |
Implementujemy interfejs obserwowanego do SiteRenderer:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class SiteRenderer implements Obserwowany{ private List<Obserwator> obsewatorzy = new ArrayList<Obserwator>(); // ... public void updateContent() { //kod aktualizujacy wyglad witryny powiadomWszystkich(); } // ... public void dodajObserwatora(Obserwator o) { obsewatorzy.add(o); } public void usunObserwatora(Obserwator o) { obsewatorzy.remove(o); } public void powiadomWszystkich() { for (Obserwator obs : obsewatorzy) { obs.aktualizuj(); } } } |
Teraz każdy obiekt który ma być poinformowany o zmianie stanu obiektu obserwowanego musi dopisać się do jego listy obserwatorów, a obserwator będzie go o każdej zmianie informował poprzez wywołanie metody aktualizuj();
Diagram wzroca: