<?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ě
*/
<?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()
);