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ć.

Pozostaw Odpowiedź