php wzorzec obserwator

Wzorzec projektowy – Obserwator

Wzorzec Obserwator (ang. Observer) używany jest do powiadamiania wybranych obiektów o zmianie stanu innych obiektów. Dzięki zastosowaniu tego wzorca można odizolować od siebie obiekty tak, że nie są one ze sobą sztywno powiązane. Zgodnie z poniższym diagramem we wzorcu występują dwa podstawowe typy obiektów (interfejsy):

  • obserwowany – obiekt, który jest śledzony; kiedy zmieni się jego stan – wywołuje metodę powiadomObserwatorow() i informuje o tym wszystkich obserwatorów. Obiekt obserwowany dodaje i usuwa obserwatorów korzystając z dwóch metod: dodajObserwatora(), usunObserwatora(),
  • obserwator – obiekt oczekujący na powiadomienie o zmianie stanu obiektu obserwowanego. Obserwator otrzymuje referencję do obiektu obserwowanego.
wzorzec projektowy obserwator
Źródło: pl.wikipedia.org/wiki/Obserwator_(wzorzec_projektowy)

Aby uprościć sobie życie skorzystamy z wbudowanego w PHP interfejsu obserwatora SplObserver.

Przykład implementacji

W poniższym przykładzie mamy dwóch obserwatorów: Observer1 i Observer2, którzy wyświetlą krótki tekst reagując na powiadomienie – notify() z podmiotu obserwowanego Subject.

Klasa Subject, czyli podmiot obserwowany ustawia w konstruktorze uchwyt do wbudowanej w PHP biblioteki SPL. Korzystając z tej biblioteki mamy do dyspozycji gotowe metody: attach (dodaje obserwatora/ów), detach (usuwa obserwatora/ów) oraz notify (powiadamia obserwatora/ów o zmianie stanu obiektu/ów).

Klasa testująca:

Konkretny przykład

Obiekt obserwowany Mailing posiada metodę add(), która symuluje dodanie adresu e-mail do bazy danych subskrybentów. Jeśli wszystko odbędzie się bez komplikacji a funkcja zwróci $this->state = true, uruchomione zostanie zdarzenie notify() z powiadomieniem, które odbierze obserwator – SendMail. Obserwator wysyła wiadomość mailową potwierdzającą zapis do bazy mailingowej.


Przykład na GitHub →


WZORCE PROJEKTOWE


Leave a Comment

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *