/ Gists / 8. Adapter
On gists

8. Adapter

Navrhove vzory - Bohmer

adapter.php Raw #

<?php

include "1.php";

/*
    Návrhový vzor Adapter přizpůsobí rozhraní určité třídy rozhraní požadovanému
    klientem a umožní tak spolupráci tříd, které by kvůli nekompatibilním rozhraním
    nebyly schopné spolupracovat.


    Definice
    ---------
    Návrhový vzor Adapter přizpůsobí rozhraní určité třídy rozhraní požadovanému
    klientem a umožní tak spolupráci tříd, které by kvůli nekompatibilním rozhraním
    nebyly schopné spolupracovat.
    Pro vytvoření adaptéru, který umožní spolupráci dvou nekompatibilních rozhraní,
    je nutné provést následující kroky:
    1. Lokalizovat rozdíly mezi nabízeným a požadovaným rozhraním.
    2. Implementovat novou třídu, která bude poskytovat požadované rozhraní.
    3. Vytvořit způsob, jak předat adaptéru objekt, který má být přizpůsobený
    – například pomocí principu vkládání závislostí (Dependency Injection).
    4. Implementovat všechny metody vyžadované rozhraním a delegovat požadavky
    dále na příslušné metody původního objektu.
    5. Přihlížet k signalizování chyb.
    6. V aplikaci využívat objekt adaptéru a pomocí něho „obalit“ původní objekt.

*/




class Title
{
    const INFO_CATEGORY = 'category';
    const INFO_PAGECOUNT = 'pageCount';
    const TITLE_OPEN = 1;
    const TITLE_CLOSE = 0;

    protected $info = array();
    protected $currentPage = 0;
    protected $state = self::TITLE_CLOSE;

    public function __construct($pageCount, $category)
    {
        $this->info[self::INFO_PAGECOUNT] = $pageCount;
        $this->info[self::INFO_CATEGORY] = $category;
    }

    public function getInfo($info)
    {
        if (isset($this->info[$info])) {
            return $this->info[$info];
        }
    }

    public function setClosed($state)
    {
        $this->state = $state;
    }

    public function getClosed()
    {
        return $this->state;
    }

    public function setCurrentPage($page)
    {
        if (self::TITLE_CLOSE == $this->state) {
            $this->setClosed(self::TITLE_OPEN);
        }
        $this->currentPage = $page;
    }

    public function getCurrentPage()
    {
        if (self::TITLE_CLOSE == $this->state) {
            throw new ClosedException('Kniha není otevřena');
        }
        return $this->currentPage;
    }
}


// Lisi se nazvy metod, parametry atd ...
$title = new Title(100, 'PC');
$title->setCurrentPage(47);
printf(
"Kategorie: %s\n", $title->getInfo(Title::INFO_CATEGORY)
);
printf(
"Počet stran: %d\n", $title->getInfo(Title::INFO_PAGECOUNT)
);
printf(
"Kniha je otevřena na %d. straně\n", $title->getCurrentPage()
);


$book = new Book('PC', 100);
$book->open();
$book->setPageNumber(47);
printf(
"Kategorie: %s\n", $book->getCategory()
);
printf(
"Počet stran: %d\n", $book->getPageCount()
);
printf(
"Kniha je otevřena na %d. straně\n", $book->getPageNumber()
);

// OUTPUT

/*

Kategorie: PC
Počet stran: 100
Kniha je otevřena na 47. straně

Kategorie: PC
Počet stran: 100
Kniha je otevřena na 47. straně

*/

pic.md Raw #

adapter-continue.php Raw #

<?php

interface Publication 
{
    public function open();
    public function close();
    public function setPageNumber($page);
    public function getPageNumber();
    public function getDailyRate($days = 1);
    public function getCategory();
    public function getPageCount();
}



class TitleAdapter implements Publication
{
    protected $title;
    public function __construct(Title $title)
    {
        $this->title = $title;
    }

    public function open()
    {
        $this->title->setClosed(Title::TITLE_OPEN);
    }

    public function close()
    {
        $this->setPageNumber(0);
        $this->title->setClosed(Title::TITLE_CLOSE);
    }

    public function getCategory()
    {
        return $this->title->getInfo(Title::INFO_CATEGORY);
    }

    public function getPageCount()
    {
        return $this->title->getInfo(Title::INFO_PAGECOUNT);
    }

    public function getDailyRate($days = 1)
    {
        return 12;
    }

    public function getPageNumber()
    {
        try {
            return $this->title->getCurrentPage();
        } catch (ClosedException $e) {
            return 0;
        }
    }

    public function setPageNumber($page)
    {
        $this->title->setCurrentPage($page);
        return true;
    }
}


$title = new Title(100, 'PC');
$book = new TitleAdapter($title);
$book->open();
$book->setPageNumber(48);
$book->getPageNumber();

// bude stejne jako instance Title
print "Hodnoty instance třídy TitleAdapter\n";
printf("Kategorie: %s\n", $book->getCategory());
printf("Počet stran: %d\n", $book->getPageCount());
printf(
"Kniha je otevřena na %d. straně\n", $book->getPageNumber()
);

// bude stejne viz vyse
print "\nHodnoty instance třídy Title\n";
printf("Kategorie: %s\n", $title->getInfo(Title::INFO_CATEGORY));
printf("Počet stran: %d\n", $title->getInfo(Title::INFO_PAGECOUNT));
printf(
"Kniha je otevřena na %d. straně\n", $title->getCurrentPage()
);