Wzorce projektowe cz. 1 – Observer

Kodując w każdym języku mamy do czynienia ze wzorcami projektowymi (ang. design patterns), które jeżeli umiejętnie używane, ułatwią nam oraz innym zrozumienie napisanego kodu bez konieczności zaglądania do dokumentacji (nie oszukujmy się, że niejednokrotnie dokumentacja w ogóle nie występuje).

W tym miejscu chciałbym zapoczątkować  serię wpisów poświęconych wzorcom projektowym.

Observer

Wyobraźmy sobie sytuację, kiedy mamy użytkownika, którego możemy edytować, a każda zmiana wiąże się z aktualizacją jego danych w kilku innych miejscach. Co więcej, nie w każdej sytuacji chcemy aktualizować wszystkie inne wystąpienia, a jedynie poszczególne. W tym przypadku pomocny może być pattern observer’a, dzięki któremu możemy wskazać w macieżystym obiecie, gdzie po zmianach mają być dokonane modyfikacje.

Stwórzmy zatem przykład dobrze obrazujący wspomniany przypadek. Najpierw definiujemy dwie klasy abstrakcyjne typowe dla tego wzorca. Zakładamy, że każdy observer będzie coś aktualizował (stąd metoda update() ), natomiast każdy obiekt kożystający z observera musi posiadać możliwość przypięcia, odpięcia i wywołania akcji na wyżej wspomnianych:

Stwórzmy teraz Usera, który posiada kilka właściwości (imię, nazwisko oraz umiejętności). Po zmianie umiejętności chcielibyśmy zaktualizować dane Linkedin (i może na kilku innych serwisach społecznościowych).

Jak widać po wykonaniu updateSkills()  każemy wszystkim observer’om zaktualizować dane w kontekście danego User’a. Pozostaje zatem zaimplementować obsługę aktualizacji na Linkedin itp.

Analogicznie do powyższego tworzymy inne implementacje i na konieć, ubierając wszystko w jedną całość możemy stworzyć użytkownika i zaktualizować jego umiejętności na Linkedin:

Oczywiście jeżeli mielibyśmy więcej observerów to analagicznie dołączamy je za pomocą metody attach()  i wówczas każdy z nich wykona u siebie update() .

Na GitHubie znajdują się generyczne przykłady wzorców projektowych, a repo sukcesywnie będzie powiększane o nowe (wraz z nowymi wpisami na blogu).