/ Gists / 5. Builder
On gists

5. Builder

Navrhove vzory - Bohmer

builder.php Raw #

<?php

include "1.php";

/*
Návrhový vzor Builder odděluje konstrukci komplexních objektů od jejich reprezentace
tak, aby se dal stejný konstrukční proces použít při tvorbě různých reprezentací.
*/

/* 
    DEFINICE:
    Návrhový vzor Builder odděluje konstrukci komplexních objektů od jejich reprezentace
    tak, aby se dal stejný konstrukční proces použít při tvorbě různých reprezentací.
    Pro dosažení tohoto cíle je nutné provést následující kroky:
    1. Definovat třídu reprezentující výsledný produkt.
    2. Definovat rozhraní stavitele, jenž bude schopný sestrojit stranu z bodu 1.
    3. Vytvořit minimálně dvě konkrétní implementace rozhraní z bodu 2.
    4. Definovat třídu, která pomocí stavitele z bodu 3 řídí sestrojení produktu.
*/

/*
    ULOHA:

    1. Definovat třídu reprezentující jednu stranu knihy.
    2. Definovat rozhraní stavitele, jenž bude schopný sestrojit stranu z bodu 1.
    3. Vytvořit stavitele, kteří sestrojí první a poslední stranu knihy.
    4. Definovat třídu sazeče, který pomocí stavitelů z bodu 3 řídí sestrojení jednotlivých
    stran.

*/

class Page
{
    protected $header;
    protected $body;
    protected $footer;

    public function getHeader()
    {
        return $this->header;
    }

    public function setHeader($header)
    {
        $this->header = $header;
    }

    public function getBody()
    {
        return $this->body;
    }

    public function setBody($body)
    {
        $this->body = $body;
    }

    public function getFooter()
    {
        return $this->footer;
    }

    public function setFooter($footer)
    {
        $this->footer = $footer;
    }
}

interface PageBuilder
{
    public function getPage();
    public function createNewPage();
    public function buildHeader();
    public function buildBody();
    public function buildFooter();
}

abstract class AbstractPageBuilder implements PageBuilder
{
    protected $page;

    public function getPage()
    {
        return $this->page;
    }

    public function createNewPage()
    {
        $this->page = new Page();
    }
}

class FirstPageBuilder extends AbstractPageBuilder
{
    public function buildHeader()
    {
        $this->page->setHeader('Záhlaví první strany');
    }

    public function buildBody()
    {
        $this->page->setBody('Tělo první strany');
    }

    public function buildFooter()
    {
        $this->page->setFooter('Zápatí první strany');
    }
}

class LastPageBuilder extends AbstractPageBuilder
{
    public function buildHeader()
    {
        $this->page->setHeader('Záhlaví poslední strany');
    }

    public function buildBody()
    {
        $this->page->setBody('Tělo poslední strany');
    }
    
    public function buildFooter()
    {
        $this->page->setFooter('Zápatí poslední strany');
    }
}

// DIRECTOR
class Compositor
{
    protected $pageBuilder;

    public function setPageBuilder(PageBuilder $pageBuilder)
    {
        $this->pageBuilder = $pageBuilder;
    }

    public function getPage()
    {
        return $this->pageBuilder->getPage();
    }

    public function compositePage()
    {
        $this->pageBuilder->createNewPage();
        $this->pageBuilder->buildHeader();
        $this->pageBuilder->buildBody();
        $this->pageBuilder->buildFooter();
    }
}

// USAGE
$firstPageBuilder = new FirstPageBuilder();
$lastPageBuilder = new LastPageBuilder();

$compositor = new Compositor();
$compositor->setPageBuilder($firstPageBuilder);
$compositor->compositePage();
$firstPage = $compositor->getPage();
var_dump($firstPage);

$compositor->setPageBuilder($lastPageBuilder);
$compositor->compositePage();
$lastPage = $compositor->getPage();
var_dump($lastPage);


/*

C:\wamp64\www\Bohmer\5.php:150:
object(Page)[4]
  protected 'header' => string 'Záhlaví první strany' (length=23)
  protected 'body' => string 'Tělo první strany' (length=19)
  protected 'footer' => string 'Zápatí první strany' (length=22)
  
C:\wamp64\www\Bohmer\5.php:155:
object(Page)[5]
  protected 'header' => string 'Záhlaví poslední strany' (length=26)
  protected 'body' => string 'Tělo poslední strany' (length=22)
  protected 'footer' => string 'Zápatí poslední strany' (length=25)

*/