4 Ekim 2009Php Decorate Design Pattern
Decorate design pattern ile bir sınıfa başka bir sınıfı gömerek o sınıfa yeni bir sınıfın özelliklerini katmaya decorate pattern denir.
Decorate design pattern için bir interface tanımlayalım. Bu interface sabit bir metot içereceği için basit şekilde vereceğiz tabi siz kendinize göre oluşturabilirsiniz.
< ?php interface isimDecorate { public function __construct(isim $isim); } ?>
yukarıdaki interface de bir yapılandırıcı metot tanımladık ve bu metota adı isim olan bir sınıfın geleceğini belirttik. Şimdi de interface için uygun bir sınıf yazalım.
< ?php class isimDecorateClass implements isimDecorate { public $isim; public function __construct(isim $isim) { $this->isim = $isim; } } ?>
yukarıdaki isim sınıfımızı mevcut arayüzümüze göre yazdık. Yapılandırıcı metoduna isim adında bir sınıfın geleceğini ve bu gelen sınıfı da isimDecorate sınıfımızın içindeki publictanımlı $isim e aktaracağız.
Şimdide isim sınıfımızı tanımlayalım.
< ?php class isim { private $ad; private $soyad; public function adTanimla($ad) { $this->ad = $ad; return $this; } public function soyadTanimla($soyad) { $this->soyad = $soyad; return $this; } public function adVeSoyadGetir() { echo 'Adınız: '.$this->ad.' Soyadınız: '.$this->soyad; } } ?>
Mevcut sınıflarımızı artık hazırladığımıza göre şimdi ise nasıl kullanacağız ona görelim.
< ?php $isim = new isim; $isim->adTanimla('yusuf'); $isim->soyadTanimla('koç'); $isimDecorate = new isimDecorateClass($isim); $isimDecorate->isim->adVeSoyadGetir(); ?>
Evet görüldüğü üzere önce isim sınıfımızı new ile başlatıp ad ve soyad tanımladıktan sonra oluşturduğumuz bu sınıfı isimDecorate içine gömdük ve isimDecorate sınıfına isim sınıfının özelliklerini katmış olduk.
Soru ve görüşleriniz için yorumları kullanabilirsiniz


Tam olarak pratikte ne işimize yarar ?
@Gökhan
Birbirlerinden bağımsız iki sinif birleştirme gibi düşünebilirsin. Yani bir nevi extends ile türetmek gibi de sayılabilir.
Aslında şu işe yarayabilir.
Adam Page adında bir decorate yazar.
Sonra Session, Post, Get, Cookie ne kadar parametre varsa hepsinin ayrı ayrı class larını yazıp, bunu içine gömer.
daha sonra,
$page->session->get(‘uye_id’);
$page->get->get(‘sayfa_no’);
gibi işler yapabilir.
hatta parameters diye bi interface yazar, session, cookie, get ve post classlarını oradan implement edebilir. Çok güzel olur.
küçük bir hata :
$isimDecorate->isim->adVeSoyadGoster(); // bu satir
$isimDecorate->isim->adVeSoyadGetir(); // olmalı
teşekkür ederim kemal makeledeki hata güncellenmiştir.
Ya ben bunu anlamadım :S Extends ten farkı nedir? Extends yerine bunu kullanmak ne gibi bir avantaj sağlar?