Professional Documents
Culture Documents
Dizajn Sabloni
Dizajn Sabloni
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;
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;
• 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