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:

  1. Stworzenie interfejsu Handler: Definiuje metodę do obsługi żądania.
  2. 
    interface Handler {
      public function handle(string $request): string;
    }
    				
  3. Stworzenie konkretnych handlerów: Każdy handler implementuje interfejs Handler i obsługuje żądanie lub przekazuje je dalej.
  4. 
    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.';
      }
    }
    				
  5. Łańcuch odpowiedzialności: Tworzymy łańcuch handlerów, gdzie każdy handler ma referencję do następnego w łańcuchu.
  6. 
    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);
      }
    }
    				
  7. Użycie łańcucha: Tworzymy instancję łańcucha i dodajemy handlerów. Następnie wysyłamy żądanie.
  8. 
    $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.

Dodaj komentarz 0

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