<?php
/*
Návrhový vzor Facade poskytuje zjednodušené rozhraní pro sérii rozhraní. Nabízí
rozhraní, které zjednodušuje používání základního systému.
Pro implementaci návrhového vzoru Facade jsou nutné následující kroky:
1. Identifikovat třídy a objekty systému, které mají být schované za fasádou.
2. Definovat operace, které má fasáda umožnit.
3. Implementovat třídy fasády a vytvořit metody, pomocí nichž je fasáda
schopná přistupovat ke schovaným komponentám.
4. Ve třídě fasády implementovat metody, které umožní zjednodušený přístup
k jednotlivým komponentám systému za účelem provedení různých operací.
Na první pohled se návrhový vzor Facade podobá vzoru Adapter. Avšak fasáda
se na rozdíl od adaptéru nevyužívá k přizpůsobení jednoho rozhraní druhému.
Fasáda zjednodušuje stávající rozhraní, redukuje počet tříd, které musí klient
používat, a zjednodušuje použitelnost určitého subsystému.
Fasáda rovněž prosazuje něco,
*/
/*
Příklad v knize je takový nic moc.
*/
class FacadePurchase
{
protected $library = null;
protected $publishers = array();
public function __construct(Library $library)
{
$this->library = $library;
}
public function addPublisher($id, AbstractPublisher $publisher)
{
$this->publishers[$id] = $publisher;
}
public function purchase($publisher, $pageCount)
{
if (!isset($this->publishers[$publisher])) {
throw new UnknownPublisherException('Neznámý vydavatel');
}
$publication = $this->publishers[$publisher]->sellPublication(
$pageCount
);
$id = IdGenerator::getInstance()->generateId();
$this->library->addToLibrary($id, $publication);
return $publication;
}
}
// USAGE
$debugger = DebuggerEcho::getInstance();
$library = new Library($debugger);
$bookPublisher = new BookPublisher('PC');
$journalPublisher = new JournalPublisher('medicína');
$facade = new FacadePurchase($library);
$facade->addPublisher('PC', $bookPublisher);
$facade->addPublisher('MEDICINA', $journalPublisher);
$facade->purchase('PC', 460);
$facade->purchase('MEDICINA', 300);