Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

CHAIN OF RESPONSIBILITY

Benzer bir sunumlar


... konulu sunumlar: "CHAIN OF RESPONSIBILITY"— Sunum transkripti:

1 CHAIN OF RESPONSIBILITY
Hacettepe Üniversitesi Bilişim Enstitüsü CHAIN OF RESPONSIBILITY Funda KAHRAMAN - Tuğba ÖZTÜRK 2009

2 İçerik Chain Of Resposibility (CoR) Pattern tanımı CoR Yapısı Örnekler
Kullanım Alanları Diğer Patternlerle İlişkisi Kaynaklar Sorular

3 Chain Of Resposibility (CoR) GOF Tanımı
“Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.” “Gönderilen istek yada çağrının birden çok işleyici(handler) sınıf üzerinden geçmesine olanak sağlayıp çağıranın alıcı nesneye olan bağımlılığından kaçının. İşleyici (Alıcı) nesnelerden kurulu bir zincir ile gelen istek ve çağrının mutlaka o zincirden geçmesini ve işlenmesini sağlayın. ”

4 Chain Of Resposibility (CoR) Tanımı
CoR, Davranışsal (behavioral) tasarım örüntüleri içinde yer alır. CoR; gelen istek ve taleplerin, kapsamı ve kuralları belirlenmiş bir işleyici zincirinden geçmesi ve mutlaka bir işleyici tarafından karşılanmasını sağlar.Nesnelerin birbirlerinden bağımsız bir şekilde çalışabilmesini ve her sınıfın sadece kendisi ile ilgili işleri yapmasını sağlar Nesneler arasındaki ilişkiyi düzenler Birbirinden farklı olarak çalışan bu nesneler arasındaki tek bağ ise ortak bir mesaj(request) imzasıdır. Bütün nesneler bu mesaj imzasını kullanarak işlerini gerçekleştirir.

5 Zincirin son halkası hariç İşleyici (handler) sınıflar zincirdeki bir sonraki halkanın (successor) referansını kullanarak gelen talebin kendisi tarafından karşılanıp karşılanmayacağına karar verir, eğer bu istek zincirdeki bir üst halkanın sorumluluk alanında ise bu isteği ona yönlendirir. Bu süreç zincirdeki ara bir işleyicinin talebi karşılaması yada son işleyici sınıfa kadar talebin ulaşması ve sonlandırılmasını kapsar. CoR’ un içinde geçen sorumluluk kavramı, zincirde yer alan tüm işleyicilerin ayrı bir sorumluluk alanına sahip olduğunu gösterir. Bu sorumluluk zincirinde yer alan sınıflardan birisi gelen isteklere cevap vermekle yükümlüdür.

6 CoR Yapısı

7 Bileşenleri Handler ConcreteHandler Client
Zincirini oluşturan her bir eleman bu sınıftan türemiştir. Zincirin her elemanının ortak olan mesajı işlemesi için gerekli olan arayüzü (interface) sunar. Bu sınıf içerisinde ayrıca zincirin bir sonraki halkasına referans vardır. Bu referansın türü de yine kendi cinsindendir. ConcreteHandler Bu sınıfların sayısı istenildiği kadar olabilir. Ancak pratikte Chain of responsibility deseni, zincirdeki eleman sayısının 10'u aşmadığı durumlar için uygundur. Bu sınıfların her biri tamamen birbirinden bağımsızdır ve aralarındaki tek ortak nokta temel sınıftan türemiş olması ve ortak bir mesaj üzerinde çalışmasıdır. Client Zincirdeki elemanların sırasını belirleyen, nesneleri kullanan, zinciri şekillendiren ve zincirdeki ilk elemana isteği gönderen client dır.

8 Not: Chain of responsibility tasarım deseninde klasik olarak mesajı işleyen yalnızca bir başarılı zincir halkası vardır. Ancak bu bir zorunluluk değildir. İstenirse mesajı birden fazla halka da başarılı bir şekilde işleyebilir. Chain of responsibility desenin temel çıkış amacı işi yapacak halkayı bulabilmektir. Eğer her halkada mesaj işlenecekse Chain of responsibility deseninin bir anlamı kalmamaktadır.

9 Örnek 1 Bir nesnenin toString() metodunu çağırdınız. Bu nesne içinde toString() metodu varsa o çağrılır, yoksa super (atası olan bir üst sınıf) sınıfına bakılır, onda da metot bulunmaz ise bu şekilde devam edilir en sonunda da Object sınıfının toString() metodu çalıştırılır.

10 Örnek 2 İçine para atarak, kahve aldığımız bir kahve otomatı düşünelim.Bir kahvenin bedeli 1 lira olabilir. Kahveyi alabilmek için 1 lira değerindeki metal parayı otomata atmamız gerekiyor.Otomatın, içine atılan metal paraları tanıyabilmesi için bir zincir oluşturmamız gerekiyor.Her metal para bu zinciri, doğru para nesnesini bulana kadar baştan sona kadar dolaşacaktır.

11 package MetalParaAtma;
public abstract class MetalPara { // Metal paranin sahip oldugu deger. 5, 10, 50, 100 Kurus olabilir protected MetalPara para; public void setPara(MetalPara para) { this.para = para; } abstract public void checkPara(double atilanPara);

12 package MetalParaAtma; public class BirLira extends MetalPara { private final double kabulDeger = 100; public void checkPara(double atilanPara) { if (atilanPara == kabulDeger) System.out.println("Atilan para kabul"); } else { if (para != null) para.checkPara(atilanPara); } package MetalParaAtma; public class ElliKurus extends MetalPara { private final double kabulDeger = 50; public void checkPara(double atilanPara) { if (atilanPara == kabulDeger) System.out.println("Atilan para kabul"); } else { if (para != null) para.checkPara(atilanPara); }

13 package MetalParaAtma; public class OnKurus extends MetalPara {
private final double kabulDeger = 10; public void checkPara(double atilanPara) { if (atilanPara == kabulDeger) { System.out.println("Atilan para kabul"); } else { if (para != null) para.checkPara(atilanPara); } package MetalParaAtma; public class BesKurus extends MetalPara { private final double kabulDeger = 5; public void checkPara(double atilanPara) { if (atilanPara == kabulDeger) { System.out.println("Atilan para kabul"); } else { if (para != null) para.checkPara(atilanPara); System.out.println("Para Uygun Değil!"); }

14 package MetalParaAtma; import java.io.BufferedReader; import java.io.InputStreamReader; public class KahveOtomati { public static void main(String[] args) { BirLira birLira = new BirLira(); ElliKurus elliKurus = new ElliKurus(); OnKurus onKurus = new OnKurus(); BesKurus besKurus = new BesKurus(); birLira.setPara(elliKurus); elliKurus.setPara(onKurus); onKurus.setPara(besKurus); while (true) { System.out.println("Otomata para atınız!"); double d = 0; try { d = Double.parseDouble(new BufferedReader(new InputStreamReader(System.in)).readLine()); } catch (Exception e) { e.printStackTrace(); } birLira.checkPara(d);

15 Otomata para atınız! 100 Atilan para kabul 50 10 5 500 Para Uygun Değil!

16 Örnek 3 Şirketinizin parasından harcama yapmak istediğinizde patronunuzdan izin almalısınız. Yada patronunuzun patronundan yada onun patronundan... Yönetici -->Müdür-->Başkan Yardımcısı--->Başkan

17

18

19

20

21

22

23 Kullanım Alanları Kullanıcı sınıf ile servis sağlayan nesne arasında sıkı bağ oluşmasını engellemek için kullanılır. Kullanıcı sınıf ile servis sunucu nesneler birbirini tanımak zorunda değildirler. Loglama gereksinimlerini mümkün olan en güvenli şekilde CoR kalıbı ile gerçekleştirebilirsiniz. Örneğin oluşan istisnai durumları mutlaka loglamak istiyorsunuz ve bunu yaparken sadece veritabanını kullanmak istemiyorsunuz. Bu ihtiyaç için veritabanı, text log dosyaları ve event log gibi log kaynaklarını kullanan işleyicilerden kurulu bir zincir ile oluşan hataları ve ististanaları loglamanız mümkün.

24 Kullanım Alanları Mail Sunucularındaki Mesaj Filtreleri Derleyiciler
Mail sunucusundan mesaj mail kutunuza gelene kadar birçok filtreden geçer. Mail ilk önce spam filtresinden geçer eğer başarılı ise ardından çeşitli mail filtrelerinden de geçtikten sonra en son mailin iletilmesi modülüne gönderilir. Spam belirleme, fake mail belirleme ve mail gönderme modülleri birbirinden tamamen bağımsız ve habersizdir dolayısıyla mail gönderme işlemini bir bütün olarak ele alabilmek için her bir modülün ortak mesaj/request olan mail nesnesi üzerinde çalışması gerekir. Derleyiciler Bir metodu çağırdığımızda derleyici o metodun hangi sınıflarda bulunduğunu tespit etmek ve hangi sırada çalışacağını belirlemek amacıyla CoR desenindeki mantıktan faydalanır. Çağrılan metot ilk sınıfta yok ise bir sonraki sınıfa eğer ondan da yoksa daha üstlere doğru ilerleyerek uygun sınıfı bulana kadar zincirde ilerlemeye devam eder. Eğer zincirde uygun çağrılabilecek metot yok ise derleyiciler çoğunlukla derleme hatası dediğimiz hataları vermektedir.

25 Kullanım Alanları Yorumlayıcılar Görsel Olay(Event)'ların Yakalanması
Birçok yorumlayıcı içeren uygulama girdi olarak aldığı komutları çeşitli mekanizmalara göre kategorize eder. Örneğin komut olarak girilen yazı çalıştırılabilir dosya ise yeni bir proses açıp onu çalıştırması, komut bir resim dosyasının açılması veya mail gönderilmesi ise ilgili aksiyonların alınması hep belirli bir öncelik sırasında gerçekleşir. Görsel Olay(Event)'ların Yakalanması Bir windows uygulamasında container dediğimiz birçok kontrol bulunmaktadır. Örneğin farenin ekranda hareket etmesini Panel ,textbox veya form nesnesi yakalayabilir. Farenin hareket etmesine hangi kontroller nasıl cevap verecek noktasında olaya tepki verebilecek nesneler zinciri kurulur ve bir noktadan başlayarak zincirde devam edilir. Nesne yönelimli programlamanın temelinde türetme mantığı yatar. Birbirinden türemiş nesne zincirinde hiyerarşinin en altında bulunan bir sınıf nesnesi üzerinden herhangi bir metodu çağırdığımızda derleyici o metodun hangi sınıflarda bulunduğunu tespit etmek ve hangi sırada çalışacağını belirlemek amacıyla Chain of responsibility desenindeki mantıktan faydalanır.

26 Diğer Patternlerle İlişkisi
Composite Pattern Bir composite nesneyi oluşturan alt nesneler zincirin parçası olarak düşünülebilir.

27 Kaynaklar Design Patterns - [GOF - Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides] Design Patterns - Elements of Reuseable Object-Oriented Software Java Tasarım Şablonları ve Yazılım Mimarileri

28 SORULAR


"CHAIN OF RESPONSIBILITY" indir ppt

Benzer bir sunumlar


Google Reklamları