You are on page 1of 25

Dizajn šabloni

PHP Advance
Dizajn šabloni
• Rešenja za standardne probleme
• Creational
– Kreiranje objekata
• Structural
– Povezanost među objektima
• Behavioral
– Odnosi između objekata
Singleton
Problem:
Potrebno je onemogućiti kreiranje više od jedne instance iste
klase:

class MojaKlasa { }
$a = new MojaKlasa();
$b = new MojaKlasa();
echo $a===$b;
Singleton
Implementacija:
class Singleton
{
public static $instance;
private function __construct() { }
public static function GetInstance()
{
if(!self::$instance)
self::$instance = new Singleton();
return self::$instance;
}
}
Factory
• Ovaj šablon koristimo kada želimo da
koristimo posredničku klasu, uz pomoć koje
ćemo kreirati instancu određene klase
Factory - slučaj
class ObicanKorisnik
{ public function __construct() { echo "pozdrav korisnik"; } }

class Administrator
{ public function __construct() { echo "pozdrav administrator";
}}

class SuperAdministrator
{ public function __construct() { echo "pozdrav
superadministrator"; } }
Factory – rešenje bez šablona
$tip="Administrator";
switch($tip)
{
case "ObicanKorisnik":
$korisnik = new ObicanKorisnik();
break;
case "Administrator":
$korisnik = new Administrator();
break;
case "SuperAdministrator":
$korisnik = new SuperAdministrator();
break;
}
Rešenje sa šablonom
class FactoryKlasa
{
public static function NoviKorisnik($tip)
{
switch($tip)
{
case "ObicanKorisnik":
return new ObicanKorisnik();
break;
case "Administrator":
return new Administrator();
break;
case "SuperAdministrator":
return new SuperAdministrator();
break;
}
}
}
Poziv uz pomoć šablona
$korisnik = FactoryKlasa::NoviKorisnik("SuperAdministrator");
https://bitbucket.org/snippets/vmaric/Le4Lex

Abstract factory
• Postoji interfejs
koji definiše
buduće factory
objekte

• Svaki factory
objekat pravi
odgovarajući tip
objekta poštujući
prethodno
definisana pravila
https://bitbucket.org/snippets/vmaric/qegEeb
Builder
• Kreiranje
kompleksnih
objekata,
pomoću
jednostavnih
objekata
Decorator
• Decorator pattern omogućava izmenu
(dodavanje) funkcionalnosti postojećoj klasi,
pri čemu, za razliku od klasičnog
nasleđivanja, decorator klasa nije u
direktnoj hijerarhijskoj vezi sa klasom koju
»dekoriše«.
Originalna klasa
class Pravougaonik
{
private $a;
private $b;
public function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
public function povrsina()
{
return $this->a * $this->b;
}
}
Dekorisana klasa
class PravougaonikDecorator
{
protected $pravougaonik;
protected $a;
protected $b;

public function construct(Pravougaonik $pravougaonik)


{
$this->pravougaonik = $pravougaonik;
$this->a = $this->pravougaonik->a;
$this->b = $this->pravougaonik->b;
}
public function obim()
{
return 2*($this->a+$this->b);
}
}
Korišćenje
$p = new Pravougaonik(2,5);
echo $p->povrsina();
$pd = new PravougaonikDecorator($p);
echo $pd->obim();
Observer
• Omogućava da se stanje jednog objekta (subject), emituje
različitim objektima (subscribers) koji taj objekat
nadgledaju.
• Lista svih pretplatnika koju poseduje izdavač
• Način na koji će izdavač prosleđivati izdanje pretplatniku
• U ovom šablonu postoje specifični akteri, koji specifičnim
metodama komuniciraju jedni sa drugima. Ove metode
realizuju se putem interfejsa - jednog za pretplatnika
(observer-a) i drugog za dobavljača (distributor/subject).
Observer - implementacija
interface IPretplatnik
{
function update($sender, $args);
}

interface IDistributer
{
public function dodajPretplatnika($p);
public function otkaziPretplatnika($p);
public function posaljiUpdate();
}
Observer - Pretplatnik
class Pretplatnik implements IPretplatnik
{
private $ime;
public function __construct($ime)
{
$this->ime = $ime;
}
public function update($sender, $eventArgs)
{
echo "Promena: (" . $this->ime . ") " . $eventArgs . "<br>";
}
}
Observer - Distributer
class Distributer implements IDistributer
{
private $sviPretplatnici;

public function dodajPretplatnika($p)


{
$this->sviPretplatnici[]=$p;
}

public function otkaziPretplatnika($p)


{
unset($this->sviPretplatnici[array_search($p,$this->sviPretplatnici)]);
}
public function izmena()
{
$this->posaljiUpdate();
}
public function posaljiUpdate()
{
foreach($this->sviPretplatnici as $pp)
$pp->update($this,"Najnovija izmena");
}
}
Observer - upotreba
$d = new Distributer();
$d->dodajPretplatnika(new Pretplatnik("p1"));
$d->dodajPretplatnika(new Pretplatnik("p2"));
$d->izmena();
MVC
• Šablon za kreiranje aplikacija
• Karakterišu ga tri eksplicitno razdvojene
celine: Model, View i Controller
• Model – izvor podataka
• View - prezentacija
• Controller – poslovna logika
MVC - Model
• Klase koje rukuju bazom podataka

• Primer:

class ArticlesModel
{
public function GetArticle() {
return DbBroker::GetArr(“select * from articles”);
}
}
MVC - Controller
• Poslovna logika aplikacije
• Obično nazivu sledi ključna reč Controller
• Sadrže metode koje predstavljaju poglede
• Primer:

class ArticleController
{
public function Index() {
...
//OVDE SE ODVIJA POSLOVNA LOGIKA
...
return View();
}
}
MVC - View
• Prezentacioni deo
• Obično se naziva isto kao i metod kontrolera
• Može prikazati promenljive definisane unutar kontrolera (obično se
šalju putem asocijativnog niza)
• Primer (Article.php):

<html>
<head><title><?php echo $title; ?></title></head>
<body>
<h1><?php echo $title; ?></h1>
<?php echo $content; ?>
</body>
</html>
MVC Rutiranje
• Obično se strane rutiraju na sledeći način:
http://domen/Kontroler/Metod

You might also like