26 / 06 / 2009
chain of responsibility design pattern- php
ekleyen: Emre Çevik kategori: design patterns| php
Chain of responsibility (sorumluluk zinciri) tasarım şablonu davranışsal (Behavioral Patterns) tasarım şablonudur. Biz bu yazımızda bu şablona kısaca COR diyeceğiz. COR kendisine gelen isteği, kuralları belilenmiş sınıflar zincirinden geçirir. Zincirin son halkasına gelinceye kadar, bir önceki zincirden aldığı referans ile istenilen talebin bu sınıftan karşılanıp karşılanamayacağını araştırır. Eğer karşılanamıyorsa bir sonraki zincire geçer. Ugun zincire ulaştığında belirlenen işlemi uygulamaya sokar.
Buna en iyi örnek olarak ATM ler verilebilir. ATM lere gittiğimizde paraları, para gözüne koyduğumuzda ATM parayı tanımak için bu sistemi kullanmaktadır. 5,10,20,50 lik bankonotları kabul ettiğini düşünürsek ve biz 10 TL lik banknot koyalım. İlk başta 50 liralık banknot olup olmadığına bakar ordan 20 ye geçer ve 10 a geldiğinde bize parayı tanıdığını belirtir.
Bu tasarım şablonunu daha önce Sefer Algan‘ın yazdığı bir makalede okumuştum. Dün ise Oreily yazmış olduğu makaleye göz gezdirdim. Tanım olarak herşey çok güzeldi fakat OReily vermiş olduğu örnek konuyu tam olarak anlatmıyordu. Tüm sınıflar zincirle birbirlerine bağlıydı fakat sınıflar arasında bir akış yoktu. Neden böyle bir örnek verdiğini hala anlayabilmiş değilim.
Ben c# Sefer Algan’ın anlattığı örneği php dilinde yazdım ve bence gayette güzel oldu. Şimdi konuyu daha iyi anlamak için örneğimize bakalım.

1 2 3 4 5 6 7 8 9 | abstract class Logger { protected $successor; public function setNextLogger( Logger $successor ) { $this -> successor = $successor; } abstract public function writeLog( $request ); } |
bu sınıfımız diğer sınıflarımızada referans olan sınıfımızdır bu sınıftaki setNextLogger methodu bir sonraki zinciri referans etmemizi sağlayacaktır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | class sqlLogger extends Logger { public function writeLog( $request ) { if( $request == 'sqlLogger' ) { echo "sqlLogger ile gönderildi"; } else { echo 'sqlLogger ile gönderilemedi bir sonraki zincire geç<br>'; if( $this -> successor != NULL ) { $this -> successor -> writeLog( $request ); } } } } class textLogger extends Logger { public function writeLog( $request ) { if( $request == 'textLogger' ) { echo "textLogger ile gönderildi"; } else { echo 'textLogger ile gönderilemedi bir sonraki zincire geç<br>'; if( $this -> successor != NULL ) { $this -> successor -> writeLog( $request ); } } } } class emailLogger extends Logger { public function writeLog( $request ) { if( $request == 'emailLogger' ) { echo "emailLogger ile gönderildi"; } else { echo 'emailLogger ile gönderilemedi bir sonraki zincire geç<br>'; if( $this -> successor != NULL ) { $this -> successor -> writeLog( $request ); } else { echo 'bu son zincir yapacak bişeyler bul'; } } } } |
evet Loglama işlemini yapacak sınıflarımızıda yazdık. koddanda anlaşıldığı üzere eğer istek sağlanamazsa ise bir sonraki zincire geçmektedir.
1 2 3 4 5 6 7 8 | $l1 = new sqlLogger; $l2 = new textLogger; $l3 = new emailLogger; $l1 -> setNextLogger( $l2 ); // bir sonraki zinciri belirler $l2 -> setNextLogger( $l3 ); // bir sonraki zinciri belirler $l1 -> writeLog('emailLogger'); // log yaz |
yukarıdaki kodumuzun ekran çıktısı
sqlLogger ile gönderilemedi bir sonraki zincire geç
textLogger ile gönderilemedi bir sonraki zincire geç
emailLogger ile gönderildi
COR ile anlatacaklarımda bu kadar. COR güzel ve kullanışlı bir sınıf olduğunu düşünüyorum en azından ben çok sevdim. Aşağıya kodları bir bütün olarak yazıyorum.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | <?php class sqlLogger extends Logger { public function writeLog( $request ) { if( $request == 'sqlLogger' ) { echo "sqlLogger ile gönderildi"; } else { echo 'sqlLogger ile gönderilemedi bir sonraki zincire geç<br>'; if( $this -> successor != NULL ) { $this -> successor -> writeLog( $request ); } } } } class textLogger extends Logger { public function writeLog( $request ) { if( $request == 'textLogger' ) { echo "textLogger ile gönderildi"; } else { echo 'textLogger ile gönderilemedi bir sonraki zincire geç<br>'; if( $this -> successor != NULL ) { $this -> successor -> writeLog( $request ); } } } } class emailLogger extends Logger { public function writeLog( $request ) { if( $request == 'emailLogger' ) { echo "emailLogger ile gönderildi"; } else { echo 'emailLogger ile gönderilemedi bir sonraki zincire geç<br>'; if( $this -> successor != NULL ) { $this -> successor -> writeLog( $request ); } else { echo 'bu son zincir yapacak bişeyler bul'; } } } } $l1 = new sqlLogger; $l2 = new textLogger; $l3 = new emailLogger; $l1 -> setNextLogger( $l2 ); $l2 -> setNextLogger( $l3 ); $l1 -> writeLog('emailLogger'); ?> |
dosya : chain of responsibilty
benzer konular:















design patterns