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 interfejsDataProcessor
i zamienia dane na wielkie litery. - Klasa używająca interfejsu: Tworzymy klasę
DataHandler
, która przyjmuje obiekt implementującyDataProcessor
i używa go do przetworzenia danych. - Użycie: Tworzymy obiekt
DataHandler
i 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.