Wzorzec projektowy obserwator należy do czynnościowych wzorców projektowych. Celem tego wzorca jest wywoływanie klasy zawierającej klasy obserwatorów w momencie, gdy zajdzie określona zmiana w obiekcie obserwowanym. Innymi słowy jeżeli obserwowany obiekt zmienia stan, wtedy uruchamia on odpowiednią metodę klasy zawierającej obserwatorów a ta wywołuje kolejno metody na zarejestrowanych obserwatorach.
Przykładowy diagram UML dla wzorca projektowego obserwator
Na poniższym diagramie UML klasa MovingPoint dziedziczy po interfejsie iSubject, który przechowuje wskaźnik do obiektu klasy Observers. Klasa Observers agreguje wielokrotnie interfejsy iSubject, co z kolei oznacza, że obiekty klasy MovingPoint są w tym przypadku równocześnie obserwatorami. Możliwe jest oczywiście zaimplementowanie oddzielnej klasy reagującej na zmiany w obserwowanych obiektach.
Co ważne interfejs iSubject automatycznie rejestruje się do podanego wskaźnika na obiekt klasy obserwatora Observers. Czyni to za pomocą operatora += wewnątrz konstruktora interfejsu iSubject. Również usunięcie obiektu jest realizowane przez ten interfejs w jego wirtualnym destruktorze z wykorzystaniem operatora -=.
Każdy punkt po zmianie położenia wywołuje metodę checkCollision klasy Observers, która (jak sama nazwa mówi) sprawdza czy dany punkt koliduje z resztą punktów.
Przykładowa implementacja wzorca projektowego obserwator w C++
Uff, we are safe now!!!
No colision with object on position {0; 0} after moving object on position: {15; 5}
Collision!!! {15; 5} == {15; 5}
Uff, we are safe now!!!
No colision with object on position {30; 20} after moving object on position: {15; 5}