/ Gists / 12. Facade
On gists

12. Facade

Navrhove vzory - Bohmer

facade.php Raw #

<?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);