Przyszedł czas na zapoznanie się z kolejnym design pattern’em. Dlaczego właściwie fasada? Jednym z powodów może być fakt, iż często mylony jest lub utożsamiany ze wzorcem adapter, o którym już wcześniej pisałem parę słów. A trzeba to jasno powiedzieć – występują między nimi spore różnice!
fasada
Z założenia tworzy zunifikowany i uproszczony interfejs wysokiego poziomu dla podsystemu, który korzysta z własnych interfejsów. Wyobraźmy sobie taką sytuację. Wracamy zmęczeni do domu i chcemy się odprężyć. W tym celu włączamy telewizor, potem odtwarzacz dvd, nastawiamy odpowiednią temperaturę w mieszkaniu i przygaszamy światło. Dużo pracy? Nie prościej byłoby posiadać pilot, gdzie za sprawą naciśnięcia jednego przycisku wszystkie te czynności zostałyby wykonane? Rozwiązanie wydaje się być idealne! W programowaniu możemy stosować takie uproszczenie do obsługi zazwyczaj wielu obiektów różnych klas. Na początek prezentuje bardzo abstrakcyjne klasy odzwierciedlające opisaną przeze mnie sytuację.
class Telewizor {
public function WlaczTV () {
echo 'Wlaczony TV';
}
public function WylaczTV () {
echo 'Wylaczony TV';
}
}
class OdtwarzaczDVD {
public function WlaczDVD () {
echo 'Wlaczone DVD';
}
public function PuscFilm () {
echo 'Film puszczony';
}
public function WylaczDVD () {
echo 'Wylaczone DVD';
}
}
class Oswietlenie {
public function Rozjasnij () {
echo 'Rozjasnij oswietlenie';
}
public function Przygas () {
echo 'Przygas oswietlenie';
}
}
class Klimatyzacja {
private $temp = 20;
public function UstawTemp ($temp) {
$this->temp = $temp;
echo 'Ustawiono temperature '.$temp;
}
}
Teraz zastosujemy omawiany wzorzec w praktyce:
class Obsluga {
private $tv;
private $dvd;
private $light;
private $aircon;
public function __construct (Telewizor $a,OdtwarzaczDVD $b,Oswietlenie $c,Klimatyzacja $d) {
$this->tv = $a;
$this->dvd = $b;
$this->light = $c;
$this->aircon = $d;
}
public function Ustaw ($temp) {
$this->tv->WlaczTV();
$this->dvd->WlaczDVD();
$this->dvd->PuscFilm();
$this->light->Przygas();
$this->aircon->UstawTemp($temp);
}
}
Oraz użycie:
$fasada = new Obsluga (new Telewizor(),new OdtwarzaczDVD(),new Oswietlenie(),new Klimatyzacja()); $fasada->Ustaw(18);
Jak widać jedna metoda wykonuje za nas całą „brudną” robotę.
fasada a adapter
Różnica tkwi nie w ilości obsługiwanych klas przez oba wzorce! Zapamiętajmy, iż Adapter zmienia interfejs, by dostosować się do wymagań klienta, a Fasada stara się go uprościć.

