Observer Pattern esezer, 2006, 2007 Günleme.

Slides:



Advertisements
Benzer bir sunumlar
Programlama-II (Java ile Bilgisayar Programlama)
Advertisements

Saatte V km hız ile giden bir aracın t zamanda aldığı yolu bulan metodu yazınız. Metodu kullanacak bir program yazınız. ( yol=hız*zaman, x=V*t) — Metot.
SCANNER SINIFI ve KLAVYEDEN VERİ OKUNMASI
SINIFLAR Yılmaz Kılıçaslan.
NESNEYE YÖNELİK PROGRAMLAMA SINIFLAR
Veri ve Veri Yapıları Genel olarak bilgisayarlar.
Ders İçeriği Bağlantılı Liste İki Yönlü Bağlantılı Liste
BPR152 ALGORİTMA VE PROGRAMLAMA - II
İSİM UZAYLARI.
Programlama-II (Java ile Bilgisayar Programlama)
İSİM UZAYLARI.
Arayüzler.  Bir classın ne yaptığı nasıl yaptığından daha önemlidir  abstract kelimesi bir classın ne yapacağını belirler  interface tamamı abstract.
OOP UYGULAMA 5.
EDUTIME Java Day 4 Serdar TÜRKEL.
P p 8. Ünitede yinelemeli programlamanın teknikleri anlatılmaktadır. p p Gördüğünüz gibi, yinelemeli programlama bir problemin içinde problemin küçük parçalarını.
BPR152 ALGORİTMA VE PROGRAMLAMA - II
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 4: Diziler
Karar ifadeleri ve Döngüler
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 6: Sınıflar
P AKET E RIŞIMLERI SıNıFLARıN YENIDEN KULLANıMı. P AKET ( P ACKAGE ) Paketler kütüphaneleri oluşturan elemanlardır. import java.io.BufferedReader; BufferedReader.
Nesne Tabanlı Programlama Dersi Edirne Kız Teknik ve Meslek Lisesi Hazırlayan : Nuri AVCI
KOPYA YAPICI FONKSİYON, STATİK ELEMANLAR, ARKADAŞ SINIF VE FONKSİYONLAR, NESNE DİZİLERİ Yılmaz Kılıçaslan.
Java Programlama Koleksiyon(Collection) Sınıfları
Nesneye Yönelik Programlama Dr. Pelin GÖRGEL
SINIFLAR GİRİŞ Yılmaz Kılıçaslan.
BPR152 ALGORİTMA VE PROGRAMLAMA - II
Diziler.
DİZİLER.
BPR152 ALGORİTMA VE PROGRAMLAMA - II
DELEGATE OOP-UYG.
Erişim Denetimi, Fonksiyon
Önemli noktalar Paradigma Nesnelere Giriş Mesajlar / Ara bağlantılar
METODLAR.
C# Metot Overloading (Aşırı yükleme)
Sorular? Öneriler?. Referanslar Referanslar (Tekrar) Eğer aşağıdaki gibi yazarsak ne olur: int x; double y; char c; ???
İSİM UZAYLARI (NAMESPACE)
NESNEYE DAYALI PROGRAMLAMA
C#.NET 5.0 C# .NET 5.0 Eğitimleri Volkan KANAT.
İş Parçacıkları Thread(s)
LINQ (Language Integrated Query)
Java Sınıf ve Nesne Kavramı UML Gösterimi
Net Class Framework ’ ün en üst yapısına İsim Uzayı denir. İsim uzayları ; pascal programlama dilinde 1990 ve hatta öncesinden beri varolmuş, C’de yer.
ÇOK BİÇİMLİLİK POLYMORPHISM
Önceki Dersi Hatırlama !!
JAVA’DA DÖNGÜLER.
EDUTIME Java Day 8 Serdar TÜRKEL.
Numaralandırmalar(Enumaration)
Kalıtım , Sınıf Asli Ergün.
Nesneye Dayalı Programlama
DÖNGÜLER.
Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü C ++ Veri.
Trees, Vectors, Iterators. ADT Abstract Data Type (ADT) vs implementation -Soyut Veri Türleri - Uygulamaları.
Ders İçeriği Liste Soyut veri yapısı (ADT)
Bölüm 5 Nesneler ve Metotlar
Bil 102 Bölüm 6 Diziler.
Bil 102 Bölüm 3 Java’da Program Akış Denetimi Bil 1021.
Bilgisayar programlarının en büyük avantajı, kullanıcının işini kolaylaştırmalarıdır. Her bilgisayar programı bunu değişik metotlar kullanarak sağlar.
Fragment.
Ders 2- Veri türleri, Karar ve Döngü Yapıları, Görsel Kontröller
JAVA PROGRAMLAMA ORNEKLER
SINIFLAR ve NESNELER. İlk sınıfımızı ekleyelim class KrediHesap { public ulong HesapNo; public double Limit; public string KartSahibi; }
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 4: Diziler
Gizem Tanış Bozok Üniversitesi Öğr. Görevlisi.  Veri erişimi için ADO.NET kodunu yazmak ve yönetmek zordur.  Microsoft, uygulamada veritabanı aktivitelerini.
Design Patterns TASARIM ÖRÜNTÜLERİ
Hafta2 Rekürsif Algoritmalar
İbrahim Olgaç PROGRAMLAMA DİLLERİ SUNUMU C#
Nesneye Dayalı Programlama Temel Kavramlar Hüseyin ESKİ.
Bilgisayar Programlama
Kurucular(Yapıcılar), Yıkıcılar
BLP 4210 PLATFORM BAĞIMSIZ PROGRAMLAMA
Sunum transkripti:

Observer Pattern esezer, 2006, 2007 Günleme

TANIM Bir nesnenin durumunun gözlemlenmesi ve bu nesnedeki değişikliğin, nesne ile ilgilenen diğer nesnelere iletilmesini sağlayan tasarım örüntüsüdür. Bu amaçla değişiklikleri takip etmek isteyen nesneler bir şekilde değişikliğe uğrayacak nesneye kendilerini kayıt ettirirler veya o nesne hakkındaki değişikliklerden haberdar olurlar

Bir sistemi işbirliği içindeki sınıflara ayırırken ilişkili nesneler arasındaki tutarlılık sağlanmalıdır. Tutarlılığı, sınıfları birbirine sıkı sıkıya bağlayarak sağlamak istenmez, çünkü bu durum tekrar kullanılabilirliği azaltır.

Nerelerde Kullanılır Bir nesnedeki değişiklik başka nesnelerde otomatik olarak değişiklik gerektiriyorsa Bir nesnenin başka nesneleri kim olduklarına bakmaksızın bir durumdan haberdar etmeleri gerektiğinde Soru Bu örüntünün türü nedir Sizin çözümünüz nedir

Örneğin birçok GUI aracı kullanıcı arayüzündeki ekran görüntüsünü, bunları oluşturan datalardan ayırır. Kullanıcı arayüzü ile datalar birbirinden bağımsız kullanılabilmelidir, elbette bunlar bir arada da kullanılabilir olmalıdır. Hesap tablosu ya da çubuk grafik oluşturan nesne aynı verileri kullanarak farklı sunuşları yaparlar. Hesap tablosu ya da çubuk grafik birbirlerinin varlığını bilmezler fakat bunlardan ihtiyaca göre herhangi birisi diğerinden bağımsız tekrar kullanılabilir.

OBSERVER PATTERN bu ilişkilerin nasıl kurulduğunu tasvir eder. Buradaki anahtar nesneler SUBJECT ve OBSERVER’dır. Bir subjecte bağlı birçok observer olabilir. Subject nesnesinin durumunda bir değişiklik olduğunda bütün observer nesneleri bundan haberdar olur. Bunun sonucunda da bütün observer nesneleri durumlarını subject nesnesinin durumuyla senkronize etmek isterler. Bu tür bir etkileşim ayrıca PUBLISH-SUBSCRIBE olarak da bilinir. Subject bildirilerin yayınlayıcısıdır. Bu bildirileri, kendisinin izleyicilerinin kimler olduğunu umursamaksızın yayınlar. Herhangi bir sayıdaki izleyici bu bildirileri almayı kabul etmiş sayılır.

Sınıf Şeması

SUBJECT Kendi gözlemcisini (observer) bilir(??) Herhangi bir sayıda observer nesne bir subjecti izleyebilir. Observer nesnelerini ekleyebilmek ve ayırabilmek için bir arayüz sağlamalıdır.

OBSERVER Güncelleştirme haberini çok biçimli verbilmek için tanımlanmış bir arayüz.

ConcreteSubject ConcreteObserver nesnelerince durumu takip edilir İzlenen nesnedir Durum değişikliklerinde bu değişimi bildirmekle yükümlüdür

ConcreteObserver Gözlemleyen nesnedir. Subject ile tutarlı kalması için gereken güncellemeleri bilir

DAHA FAZLA BİLGİ Subject ve Observer Arasındaki Soyut Birleştirme: Subjectin bildiği tek şey observerların bir listesidir ve bu observerların her biri soyut Observer sınıfındaki basit arayüze uyarlar. Subject herhangi bir observerın somut sınıfını bilmez. Bu nedenle subject ve observer arasındaki birleştirme soyut ve minimaldir.

DAHA FAZLA BİLGİ Genele Yayın Haberleşme İçin Destek: Alışılagelmişin dışında Subjectin yaptığı bildirilerin bir alıcıya özel olması gerekmez. Genele yayın, bu yayını alan bütün nesnelere otomatik olarak gider. Subject kaç tane observer olduğu ile ilgilenmez, subjectin tek sorumluluğu bildiriyi yapmaktır. Bu da herhangi bir zamanda observer ekleme ya da çıkarma özgürlüğü verir. Observer bir bildiriyi alacağına ya da reddedeceğine kendisi karar verir.

DAHA FAZLA BİLGİ Beklenmedik Güncellemeler: Subject nesnesi, Observer nesnelerindeki değişikliklere karşı kördürler. Subjectte yapılan anlaşılır ve zararsız bir değişiklik, observerlar ve observerlara bağlı nesnelerde büyük değişiklikler yapılmasına neden olabilir Yani Değişimlerinin etkilerini bilen subject değildir

Örnek Problem Kamil Koç otobüs firmasıdır. Firmamız için bilet kesen iki tane yazıhanemiz olsun. Balgat yazıhanesi ve Kızılay yazıhanesi. Bu iki yazıhane müşteriler için sefer bilgilerini tutsun. Yeni bir sefer eklendiği zaman bizim seyahat yazıhanelerimizin bu sefer bilgilerini de ekleyeceklerini garanti etmeliyiz.

Strateji Sistem, Kamil Koç tarafından bir sefer eklendiğinde bunu otomatik olarak yazıhanelere bildirmelidir. Tasarım yeni yazıhanelere, mevcut sistemde minimum değişiklik yapılarak yer sağlamalıdır.

Çözüm - Şema

Çözüm - Kod SUBJECT public abstract class Subject { private ArrayList observers=new ArrayList(); public void AddObservers(Observer observer) observers.Add(observer); } public void RemoveObserver(Observer observer) observers.Remove(observer); public void Notify() foreach(Observer observer in observers) observer.UpdateKamilKocsRout(this);

Çözüm - Kod Observer public interface Observer { void UpdateKamilKocsRout(object Traveller); }

Çözüm - Kod ConcreteObservers public class KızılayYazanesi:Observer { public void UpdateKamilKocsRout(Object subject) if( subject is KamilKoc) AddRoutforKamilKoc((KamilKoc)subject); } private void AddRoutforKamilKoc(KamilKoc traveller) Console.WriteLine("new rout No. " + traveller.TravelRout + " Veri Tabanina Eklendi");

Çözüm - Kod ConcreteObservers public class BalgatYazanesi:Observer { public void UpdateKamilKocsRout(Object subject) if( Traveller is KamilKoc) AddRoutforKamilKoc((KamilKoc)subject); } private void AddRoutforKamilKoc(KamilKoc traveller) Console.WriteLine("new rout No. " + traveller.TravelRout + " Veri Tabanina Eklendi");

Çözüm - Kod class Client { [STAThread] static void Main(string[] args) KamilKoc KK= new KamilKoc("EC 2012",2230); KizilayYazanesi Kizilay=new KizilayYazanesi(); BalgatYazanesi Balgat=new BalgatYazanesi(); KK.AddObservers(Kizilay); KK.AddObservers(Balgat); KK.AddNewRout(); }

Java Kesiti- Tersten bakalım ! public class Customer{ static private Vector myObs; static{ myObs = new Vector(); } public static void attach(MyObserver o) { myObs.addElement(o);} public static void deattach(MyObserver o) { myObs.removeElement(o);} public static String getState() { // nesnenin durumunu gösteren bilgiyi yayınlayacak kod parçası } public void notifyObs() { for (Enumaration e = myObs.elements(); e.hasMoreElements;) ((MyObserver) e).update(this); interface MyObserver{ void update(Customer myCust) } class AddrModification implements MyObserver { public AddrModification () {} public void update(Customer myCust){ //do addressModificatios

Avantajları Subject, observer’ının içeriğinden haberdar olmadığından, subject – observer arası ikili ilişki en az seviyededir. Bu da sistemi iki bağımsız katmana ayırır. Observer Pattern, broadcast iletişimi destekler. Kim olduğundan ve sayısından bağımsız olarak güncellemelerin gerçekleşmesini sağlar. Sisteme her zaman yeni observer’lar eklenebilir, çıkartılabilir.

Dezavantajları Observer nesnesi güncellemek için kendisine gerekmese dahi değişen nesnenin tüm bilgilerine ulaşıyor . İkili ilişkiler azaltıldığı için, her ne kadar yeniden kullanılabilirlik artsa da,nesneler arasındaki bağımlılıkları koda bakarak anlamak zorlaşır. Observer’ların içeriği bilinmediğinden güncellemelerin etkisi kestirilemez. Bu riskli!!!