Wzorce projektowe – Chain of Responsibility
Założenie: Zbudujemy prosty przykład łańcucha odpowiedzialności, gdzie kilka obiektów może obsłużyć żądanie lub przekazać je dalej.
Krok po kroku:
- Stworzenie interfejsu Handler: Definiuje metodę do obsługi żądania.
- Stworzenie konkretnych handlerów: Każdy handler implementuje interfejs
Handler
i obsługuje żądanie lub przekazuje je dalej. - Łańcuch odpowiedzialności: Tworzymy łańcuch handlerów, gdzie każdy handler ma referencję do następnego w łańcuchu.
- Użycie łańcucha: Tworzymy instancję łańcucha i dodajemy handlerów. Następnie wysyłamy żądanie.
interface Handler {
public function handle(string $request): string;
}
class ConcreteHandlerA implements Handler {
public function handle(string $request): string {
if ($request === 'A') {
return 'Handler A obsłużył żądanie.';
}
return 'Handler A przekazuje żądanie dalej.';
}
}
class ConcreteHandlerB implements Handler {
public function handle(string $request): string {
if ($request === 'B') {
return 'Handler B obsłużył żądanie.';
}
return 'Handler B przekazuje żądanie dalej.';
}
}
class Chain {
private Handler $handler;
public function __construct(Handler $handler) {
$this->handler = $handler;
}
public function setNext(Handler $handler): void {
if ($this->handler instanceof Chain) {
$this->handler->setNext($handler);
} else {
$this->handler = new Chain($handler);
}
}
public function handle(string $request): string {
return $this->handler->handle($request);
}
}
$chain = new Chain(new ConcreteHandlerA());
$chain->setNext(new ConcreteHandlerB());
$response = $chain->handle('A');
echo $response . "\n"; // Wynik: Handler A obsłużył żądanie.
$response = $chain->handle('B');
echo $response . "\n"; // Wynik: Handler A przekazuje żądanie dalej.Handler B obsłużył żądanie.
$response = $chain->handle('C');
echo $response . "\n"; // Wynik: Handler A przekazuje żądanie dalej.Handler B przekazuje żądanie dalej.
Ten przykład pokazuje podstawowe działanie wzorca Chain of Responsibility w PHP. Zachęcamy do dalszego zgłębiania tematu i eksperymentowania z bardziej złożonymi przykładami.