Wzorce projektowe – Bridge
Założenie: Zrozumieć i zaimplementować wzorzec projektowy Bridge, który oddziela abstrakcyjny interfejs od jego implementacji, pozwalając na niezależne zmienianie obu części.
Krok po kroku:
- Stworzenie abstrakcyjnego interfejsu: Zdefiniujmy interfejs
Renderer
, który będzie odpowiedzialny za renderowanie danych.interface Renderer { public function render(string $data): string; }
Ten interfejs definiuje metodę
render
, która przyjmuje dane tekstowe i zwraca sformatowany tekst. - Implementacja konkretnych rendererów: Stwórzmy dwie implementacje
Renderer
:HtmlRenderer
iTextRenderer
.class HtmlRenderer implements Renderer { public function render(string $data): string { return "<p>" . htmlspecialchars($data) . "</p>"; } } class TextRenderer implements Renderer { public function render(string $data): string { return $data . "\n"; } }
HtmlRenderer
dodaje znaczniki HTML, aTextRenderer
dodaje znak nowej linii. - Klasa abstrakcyjna lub interfejs dla danych: Stwórzmy interfejs
Data
.interface Data { public function getData(): string; }
- Klasa implementująca dane: Stwórzmy klasę
MyData
implementującą interfejsData
.class MyData implements Data { private string $data; public function __construct(string $data) { $this->data = $data; } public function getData(): string { return $this->data; } }
- Klasa Bridge: Stwórzmy klasę
Bridge
, która łączyData
iRenderer
.class Bridge { private Renderer $renderer; private Data $data; public function __construct(Renderer $renderer, Data $data) { $this->renderer = $renderer; $this->data = $data; } public function show(): string { return $this->renderer->render($this->data->getData()); } }
- Użycie: Teraz możemy użyć klasy
Bridge
z różnymi rendererami.$data = new MyData("To jest przykładowy tekst."); $htmlRenderer = new HtmlRenderer(); $textRenderer = new TextRenderer(); $bridgeHtml = new Bridge($htmlRenderer, $data); $bridgeText = new Bridge($textRenderer, $data); echo $bridgeHtml->show(); // Wyświetli: <p>To jest przykładowy tekst.</p> echo $bridgeText->show(); // Wyświetli: To jest przykładowy tekst.
Ten przykład pokazuje podstawowe zastosowanie wzorca Bridge. Zachęcamy do dalszego zgłębiania tematu i eksperymentowania z różnymi implementacjami.