Wzorce projektowe – Inversion of Control
Założenie: Zrozumieć zasadę Inversion of Control (IoC) na prostym przykładzie w PHP.
Krok po kroku:
- Stworzenie interfejsu: Definiujemy interfejs
DataProcessor, który określa metodę przetwarzania danych. - Implementacja interfejsu: Tworzymy klasę
UpperCaseProcessor, która implementuje interfejsDataProcessori zamienia dane na wielkie litery. - Klasa używająca interfejsu: Tworzymy klasę
DataHandler, która przyjmuje obiekt implementującyDataProcessori używa go do przetworzenia danych. - Użycie: Tworzymy obiekt
DataHandleri używamy go do przetworzenia danych.
interface DataProcessor {
public function processData(string $data): string;
}
Ten fragment kodu definiuje interfejs, który deklaruje metodę processData. Klasy implementujące ten interfejs będą musiały zaimplementować tę metodę.
class UpperCaseProcessor implements DataProcessor {
public function processData(string $data): string {
return strtoupper($data);
}
}
Ta klasa implementuje metodę processData, która używa funkcji strtoupper do konwersji danych na wielkie litery.
class DataHandler {
private DataProcessor $processor;
public function __construct(DataProcessor $processor) {
$this->processor = $processor;
}
public function handleData(string $data): string {
return $this->processor->processData($data);
}
}
Klasa DataHandler przyjmuje w konstruktorze obiekt implementujący DataProcessor. Dzięki temu, możemy łatwo zmienić sposób przetwarzania danych, zmieniając tylko obiekt przekazywany do konstruktora.
$processor = new UpperCaseProcessor();
$handler = new DataHandler($processor);
$processedData = $handler->handleData("przykładowy tekst");
echo $processedData; // Output: PRZYKŁADOWY TEKST
W tym fragmencie kodu tworzymy obiekt UpperCaseProcessor i przekazujemy go do konstruktora DataHandler. Następnie używamy metody handleData do przetworzenia danych.
Ten przykład pokazuje podstawy zasady Inversion of Control. Zamiast DataHandler tworzyć obiekt UpperCaseProcessor bezpośrednio, zależność jest odwrócona – DataHandler zależy od abstrakcji (interfejsu DataProcessor), a nie od konkretnej implementacji.