Wzorzec projektowy Fasada upraszcza skomplikowane i złożone systemy. Można zastosować go do stworzenia API (interfejsu programistycznego aplikacji), który udostępni klientowi uproszczoną specyfikację systemu z jego popularnymi funkcjonalnościami, konkretnymi zadaniami, itd. Wiele portali i serwisów internetowych udostępnia swoje API, np: YouTube Data API, Google Maps API.
DIAGRAM WZORCA FASADA
- Element1, Element2 … Element5 – to klasy reprezentujące jakiś złożony system,
- Fasada – klasa, która implementuje elementy złożonego systemu, może je również przekształcać i/lub rozszerzać dostosowując do nowych potrzeb,
- Klient – używa interfejsu fasady.
PRZYKŁAD IMPLEMENTACJI
Klasy: Element1, Element2, Element3 są składowymi jakiegoś systemu. Kod tych klas nie musi być znany klientowi. Możemy założyć, że system zbudowany jest z setek klas, a nas interesują funkcjonalności tylko z tych trzech:
1 2 3 4 5 6 7 8 9 |
<?php // Element1.php class Element1 { public function A() { echo 'Some operation A <br />'; } } |
1 2 3 4 5 6 7 8 9 |
<?php // Element2.php class Element2 { public function B() { echo 'Some operation B <br />'; } } |
1 2 3 4 5 6 7 8 9 |
<?php // Element3.php class Element3 { public function C() { echo 'Some operation C <br />'; } } |
Fasada poprzez konstruktor pobiera instancje obiektów (elementy złożonego systemu). Konkretne funkcje (A, B i C) będą udostępnione klientowi w postaci getA, getB i getC:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php // Facade.php class Facade { private $a; private $b; private $c; public function __construct(Element1 $a, Element2 $b, Element3 $c) { $this->a = $a; $this->b = $b; $this->c = $c; } public function getA() { return $this->a->A(); } public function getB() { return $this->b->B(); } public function getC() { return $this->c->C(); } // and more elements... } |
Klient używa gotowego API:
1 2 3 4 5 6 7 8 9 10 |
<?php // Client.php spl_autoload_register(function ($class) { include $class . '.php'; }); $api = new Facade(new Element1(), new Element2(), new Element3()); $api->getA(); $api->getB(); $api->getC(); // ... |
Przykład na GitHub →