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:
- Stworzenie interfejsu Observer: Interfejs ten zdefiniuje metodę, którą będą musiały implementować wszystkie klasy obserwatorów (obserwujące zmiany).
- Stworzenie klasy Subject: Klasa ta będzie obiektem obserwowanym, który będzie powiadamiał obserwatorów o zmianach swojego stanu.
- Stworzenie konkretnego obserwatora: Tworzymy klasę implementującą interfejs
Observer
. - Użycie klas: Teraz możemy użyć stworzonych klas.
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.
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.
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.
$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!