Wzorzec facade(fasada)

Wydzielanie złożonych funkcji  np do jednej klasy co ukrywa szczegóły i pozwala w łatwy sposób uruchamiać złozone funkcjonalności. 

Wyobraźmy sobie, że struktura i treść kodu są jeszcze bardziej złożone i że przez to nie ma szans na ich przepisanie na własną rękę — pozostaje nam jedynie korzystanie z rozwiązania kalekiego, ale gotowego. Aby skonwertować plik o zawartości: 234-bluza_damska 55 532-kapelusz_męski 55 na postać tablicy obiektów, musimy wywołać wszystkie z prezentowanych funkcji (dla uproszczenia pomijamy przy tym wyodrębnianie z pliku liczby kończącej wiersz, reprezentującej cenę artykułu):

<?php
$lines = getProductFileLines('test.txt');
$objects = array();
foreach ($lines as $line)
{
    $id = getIDFromLine($line);
    $name = getNameFromLine($line);
    $objects[$id] = getProductObjectFromID($id, $name);
}

Jeśli będziemy w swoim projekcie stosować powyższą procedurę odczytu plików, zwiążemy ściśle kod projektu z kodem podsystemu wczytywania plików. Jeśli potem ów podsystem ulegnie zmianom albo zdecydujemy się na skorzystanie z innego podsystemu w jego miejsce, staniemy w obliczu problemu rozległych modyfikacji kodu projektu. Trzeba by więc powołać do życia bramkę pomiędzy tym podsystemem a resztą projektu.

Implementacja Oto prosta klasa udostępniająca interfejs do kodu proceduralnego, z którym borykaliśmy się w poprzednim punkcie:

<?php
class ProductFacade
{
    private $products = array();
    function __construct($file)
    {
        $this->file = $file;
        $this->compile();
    }
    private function compile()
    {
        $lines = getProductFileLines($this->file);
        foreach ($lines as $line)
        {
            $id = getIDFromLine($line);
            $name = getNameFromLine($line);
            $this->products[$id] = getProductObjectFromID($id, $name);
        }
    }
    function getProducts()
    {
        return $this->products;
    }
    function getProduct($id)
    {
        if (isset($this->products[$id]))
        {
            return $this->products[$id];
        }
        return null;
    }
}

Z punktu widzenia użytkownika tego kodu dostęp do obiektów Product generowanych na podstawie pliku rejestru produktów jest znacznie uproszczony:

$facade = new ProductFacade('test.txt');
$facade->getProduct(234);
Komentarze wyłączone