Wzorce projektowe – Observer

Założenie: Zrozumieć i zaimplementować wzorzec projektowy Observer w PHP, aby móc powiadamiać wiele obiektów o zmianie stanu jednego obiektu.

Krok po kroku:

  1. Stworzenie interfejsu Observer: Interfejs ten zdefiniuje metodę, którą będą musiały implementować wszystkie klasy obserwatorów (obserwujące zmiany).
  2. 
    interface Observer {
        public function update(Subject $subject);
    }
    				

    Ten kod definiuje interfejs Observer z metodą update, która przyjmuje obiekt klasy Subject jako argument. Każdy obserwator musi zaimplementować tę metodę, aby reagować na zmiany w obiekcie obserwowanym.

  3. Stworzenie klasy Subject: Klasa ta będzie obiektem obserwowanym, który będzie powiadamiał obserwatorów o zmianach swojego stanu.
  4. 
    class Subject {
        private array $observers = [];
        private string $state;
    
        public function attach(Observer $observer): void {
            $this->observers[] = $observer;
        }
    
        public function detach(Observer $observer): void {
            $key = array_search($observer, $this->observers, true);
            if ($key !== false) {
                unset($this->observers[$key]);
            }
        }
    
        public function notify(): void {
            foreach ($this->observers as $observer) {
                $observer->update($this);
            }
        }
    
        public function getState(): string {
            return $this->state;
        }
    
        public function setState(string $state): void {
            $this->state = $state;
            $this->notify();
        }
    }
    				

    Klasa Subject posiada tablicę obserwatorów, stan i metody do dodawania, usuwania i powiadamiania obserwatorów. Metoda notify iteruje po tablicy obserwatorów i wywołuje metodę update dla każdego z nich.

  5. Stworzenie konkretnego obserwatora: Tworzymy klasę implementującą interfejs Observer.
  6. 
    class ConcreteObserver implements Observer {
        public function update(Subject $subject): void {
            echo "Obserwator powiadomiony! Nowy stan: " . $subject->getState() . "\n";
        }
    }
    				

    Klasa ConcreteObserver implementuje interfejs Observer i wyświetla komunikat w konsoli po otrzymaniu powiadomienia.

  7. Użycie klas: Teraz możemy użyć stworzonych klas.
  8. 
    $subject = new Subject();
    $observer = new ConcreteObserver();
    $subject->attach($observer);
    $subject->setState("Stan 1");
    $subject->setState("Stan 2");
    				

    Ten kod tworzy obiekt Subject, dodaje do niego obserwatora, a następnie zmienia stan obiektu Subject, co powoduje powiadomienie obserwatora.

Ten przykład pokazuje podstawy wzorca projektowego Observer. Zachęcamy do dalszego zgłębiania tematu i eksperymentowania z różnymi implementacjami!

Dodaj komentarz 0

Your email address will not be published. Required fields are marked *