Wzorce projektowe – Visitor
Założenie: Zrozumieć i zaimplementować wzorzec projektowy Visitor w PHP, aby dodawać nowe operacje do istniejącej hierarchii klas bez konieczności modyfikowania tych klas.
Krok po kroku:
- Definicja interfejsu Visitor: Definiujemy interfejs, który będzie zawierał metody dla każdej operacji, którą chcemy wykonywać na elementach naszej hierarchii.
- Definicja klas elementów (ElementA, ElementB): Tworzymy klasy reprezentujące elementy, na których będą wykonywane operacje. Każda klasa implementuje metodę `accept`, która przyjmuje obiekt interfejsu
Visitor
. - Implementacja konkretnych Visitorów: Tworzymy klasy implementujące interfejs
Visitor
, każda dla innej operacji. - Użycie Visitora: Tworzymy obiekty elementów i visitora, a następnie wywołujemy metodę `accept`.
interface Visitor {
public function visitElementA(ElementA $element);
public function visitElementB(ElementB $element);
}
Ten kod definiuje interfejs Visitor
z metodami visitElementA
i visitElementB
. Każda metoda przyjmuje jako argument obiekt konkretnego typu elementu.
class ElementA {
public function accept(Visitor $visitor) {
$visitor->visitElementA($this);
}
}
class ElementB {
public function accept(Visitor $visitor) {
$visitor->visitElementB($this);
}
}
Metoda accept
przekazuje obiekt klasy do odpowiedniej metody w obiekcie Visitor
.
class ConcreteVisitorA implements Visitor {
public function visitElementA(ElementA $element) {
echo "Operacja A na elemencie A\n";
}
public function visitElementB(ElementB $element) {
echo "Operacja A na elemencie B\n";
}
}
class ConcreteVisitorB implements Visitor {
public function visitElementA(ElementA $element) {
echo "Operacja B na elemencie A\n";
}
public function visitElementB(ElementB $element) {
echo "Operacja B na elemencie B\n";
}
}
Klasy ConcreteVisitorA
i ConcreteVisitorB
implementują interfejs Visitor
i definiują konkretne operacje.
$elementA = new ElementA();
$elementB = new ElementB();
$visitorA = new ConcreteVisitorA();
$visitorB = new ConcreteVisitorB();
$elementA->accept($visitorA);
$elementB->accept($visitorA);
$elementA->accept($visitorB);
$elementB->accept($visitorB);
Ten kod demonstruje, jak używać visitora do wykonywania różnych operacji na różnych elementach.
Ten przykład pokazuje podstawy wzorca projektowego Visitor. Zachęcamy do dalszego zgłębiania tematu i eksperymentowania z różnymi implementacjami!