Obserwator (ang. Observer) jest jednym z najpopularniejszych wzorców projektowych. Niemal w każdym momencie korzystania z komputera mamy z nim kontakt. Jego zadaniem jest informowanie o zmianie stanu obiektu inne zainteresowane obiekty.
Jak wspomniałem z wzorcem obserwator mamy do czynienia niemal w każdym momencie korzystania z komputera. Wzorzec ten jest podstawą programowania zdarzeniowego, a co za tym idzie aplikacji z graficznym interfejsem (GUI).
Aby móc z niego skorzystać należy stworzyć dwa rodzaje klas. Pierwszą pełniącą rolę obiektu obserwowanego, która informuje o zmianie swojego stanu oraz drugą będącą obiektem obserwującym oczekującym na informację o zmianie stanu.
public interface Obserwowany
{
public void dodajObserwatora( Obserwator obserwator );
public void usunObserwatora( Obserwator obserwator );
public void powiadomObserwatorow();
}
public interface Obserwator
{
public void uaktualnij();
}
Zobacz więcej kodu
Powyższe interfejsy przedstawiają metody wymagane przez obie klasy do poprawnego zaimplementowania wzorca. Metody dodajObserwatora oraz usunObserwatora odpowiadają za zarządzanie listą obserwatorów. Lista ta w zależności od wykorzystywanego języka jest implementowana jako dowolna liniowa struktura danych (kolejka, stos, tablica). Metoda powiadomObserwatorow wywoływana jest w chwili zmiany stanu obiektu. Jej zadaniem jest iteracja po elementach listy obserwatorów oraz wywołanie metody uaktualnij każdego z nich.
Skoro już wiemy w jaki sposób obserwator jest informowany o zmianie stanu obserwowanego obiektu należy przyjrzeć się sposobowi przekazywania nowej wartości stanu. Możemy tego dokonać na dwa sposoby. Pierwszym, a zarazem najczęściej używanym (za sprawą wykorzystywania go w celu obsługi zdarzeń) jest przekazanie nowego stanu jako parametr metody uaktualnij.
private function init( ):void
{
TextInput.addEventListener( Event.CHANGE, TextInputChange );
}
private function TextInputChange( event :Event ): void
{
Alert.show( event.currentTarget.text);
}
Opis: Przykład przekazywania nowego stanu przez parametr (Flex)
Drugim sposobem jest pobranie nowych danych przez wywołanie odpowiedniej metody klasy obserwowanej. Rozwiązanie to jest bardziej elastyczne, gdyż sam obserwator decyduje o działaniu podjętym w chwili zmiany stanu. Przykład tego sposobu powiadamiania dostępny jest pod adresem podanym przy kodzie interfejsów z początku notki.
Dzięki wzorcowi obserwatora możemy dodać możliwości obsługi zdarzeń w chwili, gdy sam język nie wspiera paradygmatu programowania zdarzeniowego. Przykładem tego może być klasa Event frameworka Kohana. Podczas zapoznawania się z nią przydatna może okazać się dokumentacja Kohany.
2 odpowiedzi do “Obserwator”
zwykle nie zostawiam komentarzy ale tym razem sie pokusze :}
mam nadzieje stary ze krotko opiszesz kazdy z wzorcow
bo wielu osobom to sie przyda, niestety ja mialem problemy z wytlumaczeniem tego moim znajomym, chociaz sam rozumiem o co chodzi
jezeli chodzi o design patterns to jest to niezwykle wazna rzecz w programowaniu w zespole przy duzych projektach tylko ze nigdzie tego nie ucza, i wiele osob nie ma pojecia o tym
notatka krotka, ale przez to przystepna i przyjemna
powodzenia :}
po przeczytaniu początku komentarze zaczynałem się bać :)) tak będę starał opisać każdy :)
thx