MVC, MVP ve Mediator ile TDD Tecrübeleri. Kenan SEVİNDİK

Benzer belgeler
MVP ve Mediator ile Loose Coupled, Modüler UI Geliştirme

MVP, Observer ve Mediator Örüntüleri ile Yeniden Kullanılabilir Uygulama Bileşenleri Geliştirme

MVC, MVP ve Mediator ile TDD Tecrübeleri

Burak Kıymaz JAVA FX

Java ile Tasarım Prensipleri ve Tasarım Örüntüleri

TRAKYA BİRLİK WEBSİTE YÖNETİM PANELİ. Kullanıcı Dokümantasyonu

MOBİL UYGULAMA GELİŞTİRME

Client Server Database

Android Ders Notları

Görsel Programlama DERS 08. Görsel Programlama - Ders08/ 1

Yeni bir proje açarken File New - Web Site diyoruz. Gelen ekranda Visual Basic veya C# seçilebilir. Biz ders kapsamında C# programlama dilini seçtik.

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

Görsel Programlama (Visual Programming)

ARDUINO NEXTION UYGULAMASI. Bu makale, Arduino UNO kartı ile Nextion HMI ekranlarının nasıl kontrol edildiğini anlatmaktadır.

MAT214 BİLGİSAYAR PROGRAMLAMA II DERSİ Ders 12: Grafik Kullanıcı Arayüzü (Graphical User Interface-GUI)

JavaServerFaces. Ahmet Demirelli. SCJP 5.0, SCWCD 1.4

GIDA İŞLETMELERİNİN MODERNİZASYON VERİ GİRİŞ İŞLEMLERİ

ARLAB ARaştırma LABoratuvar Projesi Kullanım Kılavuzu

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

Dinamik Proxy Tabanlı View Model API

ASP.NET ile Bir Web Sitesi Oluşturma

1 GİRİŞ 1 C# Hakkında Genel Bilgiler 1.Net Framework 1 CLR 2 CLR Ve CTS 2 Temel Sınıf Kütüphanesi 3 CIL 3 Algoritma Nedir? 4 Sözde Kod (Pseudocode) 5

Ecat 8. Hakbim Bilgi İşlem A.Ş. Versiyon

BİLGİ TEKNOLOJİLERİ EĞİTİM KILAVUZU

Kullanım Kılavuzu Milli Eğitim Bakanlığı 2010

Proje Takip Platformu Kullanım Kılavuzu

C# Form Uygulamaları. Nesne Tabanlı Programlama I (C#) Ders Notu. S.Ü.Akören A.R.E. Meslek Yüksekokulu C.ÖZCAN- F.SARAY

HSancak Nesne Tabanlı Programlama I Ders Notları

AYDES PROJESİ MESAJ KUTUSU EĞİTİM DOKÜMANI

1.DERS KATALOG Ders kataloğu ekranında yeni ders tanımlamaları yapılabilir ve Seçmeli havuz dersleri oluşturulabilmektedir.

MESS BULUT SİSTEMİ ÜYE PORTALI KULLANIM KILAVUZU

JavaFX Temelleri (2)

MapCodeX İçmesuyu Modülü Kullanım Kılavuzu

AYNİ BAĞIŞ HİZMET GRUBU EĞİTİM DOKÜMANI

HSancak Nesne Tabanlı Programlama I Ders Notları

Java da. ve AWT ve SWING Kütüphaneleri. BBS-515 Nesneye Yönelik Programlama. Ders #8 (9 Aralık 2009)

DEFTER-BEYAN SİSTEMİ SABİT KIYMET YÖNETİMİ KULLANICI KILAVUZU

BLM401 Mobil Cihazlar için ANDROİD İşletim Sistemi SERVİS BİLEŞENLERİ. BLM401 Dr.Refik SAMET

HESAP MAKİNASI YAPIMI

2 VISUAL STUDIO 2012 GELİŞTİRME ORTAMI

BÖLÜM 04. Çalışma Unsurları

DOKUZ EYLÜL ÜNİVERSİTESİ TIP FAKÜLTESİ e-pdö UYGULAMA YÖNERGESİ.

Fatura Dinamik Kodlama İyileştirmeleri

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

IOSİS SOS BAYIPUAN BAYI KULLANICI KILAVUZU

YENİ NESİL ÖDEME KAYDEDİCİ CİHAZLARDAN GERÇEKLEŞTİRİLEN SATIŞLARA İLİŞKİN MALİ BİLGİLERİN İNTERNET VERGİ DAİRESİ ÜZERİNDEN BİLDİRİM

Yazılım Nedir? 2. Yazılımın Tarihçesi 3. Yazılım Grupları 4 Sistem Yazılımları 4 Kullanıcı Yazılımları 5. Yazılımın Önemi 6

Çek ĠĢlemler Kullanım ve Uyarlama Dokümanı

İçindekiler Tablosu Talep Destek Yönetim Sistemi Programı...3

E-Posta Yönetimi. E-Posta Açma, Silme ve Yönetim Kılavuzu

VERİ TABANI YÖNETİM SİSTEMLERİ II. 9. FORMLAR ve ORACLE FORMS PROGRAMINDA FORM OLUŞTURMA

TÜRKİYE ESNAF VE SANATKARLARI KONFEDERASYONU Online İşlemler (Basılı Evrak Stok Takip Sistemi ) Kullanma Kılavuzu

Android Kaynakları (Resources)

BÖLÜM KATMAN OLUŞTURMA (LAYER) Command line: Layer (veya transparent komutu için 'Layer kullanın)

MOBİL UYGULAMA GELİŞTİRME

T.C. Başbakanlık Gümrük Müsteşarlığı Muhabere ve Elektronik Dairesi Başkanlığı

ARDIŞIL DİYAGRAM YAPI DİYAGRAMI. Sistem Analizi ve Tasarımı Dersi

HALK SAĞLIĞI LABORATUARI WEB MODÜLÜ

1 GİRİŞ 1 Bu Kitap Kime Hitap Eder? 2 Kitapta Nelerden Bahsedilmiştir? 3 Kitabı Takip Edebilmek için Nelere İhtiyaç Duyacaksınız?

Bölüm 8. Ayrık Küme. Olcay Taner Yıldız. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, / 16

MİCRODESTEK E-SMM UYGULAMASI TANITIM DOKÜMANI

ULUSAL ELEKTRONİK TEBLİGAT SİSTEMİ

Bilgi & İletişim Teknolojileri Müdürlüğü Sayfa 1 / 33

PLAN İŞLEM NUMARASI KULLANICI DOKÜMANI

MOBİL UYGULAMA GELİŞTİRME

T. C. KAMU İHALE KURUMU

AKILLI KÜRSÜ KULLANIM KILAVUZU

WEB FORMLARI. Öğr. Gör. Emine TUNÇEL Kırklareli Üniversitesi Pınarhisar Meslek Yüksekokulu

IPACK LADDER. Arayüz Dökümantasyonu

Yardım Masası Kullanım Klavuzu

BİLGİSAYAR PROGRAMLAMA. Yrd. Doç. Dr. Beytullah EREN

LAYOUT ORTAMINDA ÇALIŞMA:

Java EE web uygulamaları geliştirmek için kullanılan açık kaynak web uygulama framework üdür.

Sade ve tam ekran masaüstü kullanımının temel çıkış noktası, aranılan özelliğe çabuk erişimi sağlayan yenilikçi kullanıcı deneyimidir.

TAPU VE KADASTRO BİLGİ SİSTEMİ

ATATÜRK ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ BIM 205 GÖRSEL PROGRAMLAMA GÜZ DÖNEMİ ÖDEV-1

YZM 2105 Nesneye Yönelik Programlama

HSancak Nesne Tabanlı Programlama I Ders Notları

Aktarımı Çalıştırmak/Geri Almak 146 Alan Seçenekleri 148 Veri Tabanı Şeması 150 Veri Tabanı ile İlgili Bazı Rake Görevleri 162 Modeller 164

ETHK-20 MEYVE SEBZE KURUTUCU ISI POMPASI PLC KULLANIM KLAVUZU

Liskov Substitution Principle (LSP) Liskov un Yerine Gecme Prensibi KurumsalJava.com

VAKIFBANK SANAL POS PANELİ KULLANICI KILAVUZU

8. HAFTA KBT204 İNTERNET PROGRAMCILIĞI II. Öğr.Gör. Hakan YILMAZ.

Bilin tarafından verilen Kullanıcı Adı ve Şifresini bu alanlara giriniz. Bilin Yazılım ve Bilişim Danışmanlığı Ltd. Şti.

VET ON KULLANIM KLAVUZU

INPUTBOX KULLANIMI. Komut Düğmesine uygulanan algoritma örneği

DÖNER KANAT TEKNOLOJİ MERKEZİ (DKTM) PROJE SİSTEMİ

Bu Kitap Kime Hitap Eder? 2 Kitapta Nelerden Bahsedilmiştir? 3 Kitabı Takip Edebilmek için Nelere İhtiyaç Duyacaksınız?

BAĞIMSIZ DEĞERLENDİRİCİ KAYIT İŞLEMLERİ KALKINMA AJANSLARI YÖNETİM SİSTEMİ PROJESİ

1. Bilgisayarınızda kullandığınız Web tarayıcı programını (Internet Explorer, Mozilla Firefox vb.) çalıştırınız.

Excel de Pivot Tablolar Tasarım ve Kullanımı

KALİTE YÖNETİM BİLİŞİM SİSTEMİ UYGULAMA KLAVUZU

KONFİGURASYON TANIMLARI

AGSoft Çocuk Gelişim Takip Programı Kullanım Kılavuzu

Yardım Masası Ekran Kullanım Kılavuzu

Önemli noktalar. Paradigma Nesnelere Giriş Mesajlar / Ara bağlantılar Bilgi Gizleme (Information Hiding ) Sınıflar(Classes) Kalıtım/Inheritance

Yaşanmış Tecrübe Paylaşımı Önce Test Et Sonra Kodla XP Pratiği

Görsel Programlama (Visual Programming) 2.Hafta

İŞTİRAKLER BİLGİ ODAKLI YÖNETİŞİM SİSTEMİ KURULMASI PROJESİ (İVAS) SON KULLANICI VERİ GİRİŞ YARDIMCI DOKÜMANI

Transkript:

MVC, MVP ve Mediator ile TDD Tecrübeleri Kenan SEVİNDİK

Mimarisel Bir Örüntü: MVC Controller Veri değişiklikleri Kullanıcı girdileri ve UI olayları Bildirimler Model View Veri erişimi

MVC'nin Amacı Trygve Reenskaug'un Hedefi Neydi...?

Trygve Reenskaug'un Hedefi Kullanıcının zihnindeki mental model ile bilgisayar sistemindeki sayısal model arasındaki boşluğu doldurmaktır!

Trygve Reenskaug'un Hedefi 45 40 35 30 40 35 30 25 25 20 1 2 3 20 15 Row 1 15 10 10 5 5 0 1 2 3 0 1 1.5 2 2.5 3 Model

Günümüzdeki Kullanım Amacı: Seperation of Concern Reenskaug'un makalelerinde asıl amaç değildir, bir sonuçtur!

Günümüzdeki MVC Yorumlaması Controller Model View

MVP Sahneye...

MVC ve Veri Yönetimi Verinin oluşturulması, Güncellenmesi veya Silinmesi gibi konularla Ilgilenen kısımdır Controller Elimdeki veriyi nasıl yönetmeliyim? Sorusuna cevap bulmaya çalışılır Veri değişiklikleri Kullanıcı girdileri ve UI olayları Model Bildirimler View Veri erişimi

Elimdeki Veriyi Nasıl Yönetmeliyim? Elimdeki veri neden oluşur? Nedir? Encapsule edilmiş veri alanları, property'ler Uygulama içerisinden veri nasıl seçilir? Metinsel seçimler Satır ve sütun seçimleri Bir grup elemanın veya bir bloğun seçilmesi Veri nasıl güncellenmeli? CRUD işlemleri, taşıma, kopyalama, silme, yapıştırma...

MVC ve Kullanıcı Arayüzü Etkileşimi Kullanıcı ile veri arasındaki etkileşime odaklanan kısımdır Controller Kullanıcı veri ile nasıl etkileşime girer? sorusuna cevap arar Veri değişiklikleri Kullanıcı girdileri ve UI olayları Model Bildirimler View Veri erişimi

Kullanıcı Veri İle Nasıl Etkileşime Girmeli? Veri ekranda nasıl gösterilmeli? GUI oluşturma ve gösterme işlemi Kullanıcı girdileri ve UI olaylarından veri güncelleme işlemlerine nasıl geçiş olmalı? Kullanıcı işlemleri, fare ve klayve girdileri

Model View Presenter UI event'leri uygulamaya özel event'lere dönüştürülür Presenter UI üzerindeki değişiklikler Presenter tarafından yansıtılır Presenter Model üzerinde Değişiklik Yapabilir Model verisine erişebilir Model Model üzerindeki Değişiklikler Event'ler Ile Presenter'a iletilir

MVP Türevleri...

Passive View Etkileşimin yönü Bildirimler Model Presenter View

Supervising Controller Presenter Model View

Nereden Başlamalı? Nasıl Kodlamalı?

Modelden?

Ekranlardan?

Önce Presenter Çünkü... kullanıcı senaryoları ve gereksinimler bire bir Presenter içindeki fonksiyonlara karşılık gelmektedir

Çünkü... Geliştiriciler Presenter kısımlarını kodlamaya odaklanabilirler Kendi içlerinde de fonksiyonel gereksinimlere göre gruplara ayrılarak paralel çalışabilirler Presenter Kodları Fonksiyonel Gereksinimler View Arayüzleri UI geliştiriciler ise tamamen GUI geliştirmeye odaklanabilirler. View içerisinde sadece UI widget'ların oluşturulması, sayfalara yerleştirilmesi söz konusudur. View Implementasyonları

Çünkü... Geliştirme sürecinde TDD yaklaşımına uygun çalışmaya olanak sağlamaktadır View, Model ve ihtiyaç duyulan servis bileşenleri mock'lanarak Presenter'a verilir

Presenter ve TDD İkincil Nesne İkincil Nesne Asıl Nesne (Birim teste tabi tutulan nesnedir) İkincil Nesne

İkincil Nesneler ve Mock İşlemi Gerçek implementasyonları hazır olmayabilir Hazır olsa bile test ortamında yaratılması çalıştırılması zor olabilir Ya da çok yavaş çalışabilir, network veya dosya sistemi ile ilişkisi olabilir GUI bağlantısı söz konusu olabilir Bu ve benzeri nedenlerle ikincil nesnelerin asılları yerine sahteleri kullanılır Bunlara mock nesneler adı verilir

Durum / Etkileşim Tabanlı Test Yaklaşımları

Etkileşim Tabanlı Yaklaşım Mock nesneler üzerinde, test edilen davranışla ilgili metotların uygun sayıda ve şekilde asıl nesne tarafından çağırıldığını kontrol eden birim test yaklaşımıdır Durum Tabanlı Yaklaşım Birincil ve ikincil nesnelerin ilgili davranış sonrasında doğru state değerlerini yansıtıp yansıtmadıklarını kontrol eden birim test yaklaşımıdır İkincil nesneler olarak asılları kullanılır

Örnek 1 Örneğin kullanıcımızın, text alana girilen bir metin içindeki Türkçe karakterleri anında İngilizce'ye dönüştüren bir program talep ettiğini farz edelim.

UI Mockup Kullanıcı ile diyalogların sonucunda kullanıcı arayüzü taslak olarak ortaya çıkar. Kullanıcının ihtiyaç duyduğu, olmasını istediği fonksiyonaliteler, bu fonksiyonları UI üzerinden nasıl tetikleyeceği gibi konular kullanım durumu senaryolarının oluşturulması esnasında tespit edilir.

Sınıf ve Arayüzler 2 Metin içindeki karakterlerin dönüşümü Presenter tarafından yönetilir 3 1 ContentChangedEvent ile sol taraftaki textarea daki metin değişikliği Presenter'a bildirilir TextArea.setContent(...) metodu ile sağ taraftaki textarea'nın içeriği güncellenir

Birim Testleri @Mock private TextArea left; @Mock private TextArea right; @Mock private ContentChangedEvent event; Action kısmı Event kısmı @Test public void contentshouldbeconvertedwhentextchanged() { Mockito.when(event.getText()).thenReturn("çÇöÖşŞıİğĞüÜ"); TR2ENConverterPresenter presenter = new TR2ENConverterPresenter(left, right); presenter.contentchanged(event); Mockito.verify(right).setContent("cCoOsSiIgGuU");

Presenter Implementasyonu private TextArea left, right; public TR2ENConverterPresenter(TextArea left, TextArea right) { this.left = left; this.right = right; left.addcontentchangelistener(this); @Override public void contentchanged(contentchangedevent event) { String content = event.gettext(); content = content.replace('ç', 'c').replace('ç', 'C').replace('ı', 'i').replace('i', 'I').replace('ö', 'o').replace('ö', 'O').replace('ş', 's').replace('ş', 'S').replace('ğ', 'g').replace('ğ', 'G').replace('ü', 'u').replace('ü', 'U'); right.setcontent(content);

View Implementasyonu public void addcontentchangelistener(contentchangelistener listener) { Presenter event listener olarak kendini listeners.add(listener); register etmek için bu metodu kullanır public String getcontent() { return (String) textarea.getvalue(); public void setcontent(string content) { textarea.setvalue(content); UI state'e erişime ve değiştirmeye imkan sağlayan metotlar UI event'in uygulama event'ine dönüşümü public void textchange(textchangeevent event) { ContentChangedEvent contentchangedevent = new ContentChangedEvent(event.getText()); for(contentchangelistener listener:listeners) { listener.contentchanged(contentchangedevent);

Örnek 2 Bu örnekte de kullanıcımız sıcaklık değerini birer birer artırıp düşürdüğü bir gösterge istiyor. Sıcaklığa göre göstergedeki değerin arka planı dinamik olarak renk değiştirmeli.

UI Mockup Kullanıcı + ve butonlarına tıklayarak sıcaklık değerini birer birer artırıp düşürebilecek. Sıcaklık değeri 0'ın altında iken arka plan mavi, sıfırın üstünde yeşil, 20 derece'nin üstünde sarı, 40 derecenin üstünde de kırmızı olmalı.

Sınıf ve Arayüzler

Birim Testleri @Mock private TempButton incbutton; @Mock private TempButton decbutton; @Mock private TempText temptext; @Mock private TemperatureChangeEvent event; private Temperature temperature; private TemperatureTrackerPresenter presenter;

Birim Testleri @Test public void textshouldbeupdatedwhentemperaturechanges() { Mockito.when(event.getChange()).thenReturn(1); Mockito.when(event.getType()).thenReturn(Change.INCREASE); Assert.assertEquals(0, temperature.getvalue()); presenter.temperaturechanged(event); Assert.assertEquals(1, temperature.getvalue()); Mockito.verify(tempText).refresh();

Birim Testleri @Test public void colorshoulberedwhentemperatureaboveforty() { Mockito.when(event.getChange()).thenReturn(41); Mockito.when(event.getType()).thenReturn(Change.INCREASE); Assert.assertEquals(0, temperature.getvalue()); presenter.temperaturechanged(event); Assert.assertEquals(41, temperature.getvalue()); Mockito.verify(tempText).red(); Mockito.verify(tempText).refresh();

Presenter Impl. public void temperaturechanged(temperaturechangeevent event) { int value = event.getchange(); if(event.gettype() == Change.INCREASE) { temperature.increase(value); else { temperature.decrease(value); value = temperature.getvalue(); if(value < 0) { temptext.blue(); else if (value > 0 && value < 24) { temptext.green(); else if (value > 24 && value < 40) { temptext.yellow(); else if (value > 40) { temptext.red(); temptext.refresh();

IncButton View Impl. public void addtemperaturechangeeventlistener( TemperatureChangeListener changelistener) { listeners.add(changelistener); public IncButton() { Button btn = new Button("+"); btn.addlistener(this); setcompositionroot(btn); @Override public void buttonclick(clickevent event) { TemperatureChangeEvent temperaturechangeevent = new TemperatureChangeEvent(1, Change.INCREASE); for(temperaturechangelistener listener:listeners) { listener.temperaturechanged(temperaturechangeevent);

TempText View Impl. private Label label; public TempTextImpl(Temperature temperature) { HorizontalLayout ho = new HorizontalLayout(); ho.setspacing(true); ho.addcomponentasfirst(new Label("Temperature :")); label = new Label(new MethodProperty(temperature, "value")); ho.addcomponent(label); setcompositionroot(ho); @Override public void blue() { label.setstylename("bluelabel");

Örnek 3 Üçüncü örneğimizde kullanıcımız kişisel bağlantı bilgilerini yönettiği bir uygulama istemektedir. Uygulama ekranında sahip olduğu bağlantılar listelenecek, listelenen kayıtlardan herhangi biri seçildiğinde detay ekranında görüntülenip güncellenebilecektir.

UI Mockup Contact DetailPanel ContactList Panel GUI, ContactListPanel ve ContactDetailPanel kısımlarından oluşmaktadır. ListPanel'de mevcut contact nesneleri listelenmektedir. Listeden seçilen herhangi bir Contact'a ait bilgiler sağ taraftaki DetailPanel'de görüntülenir. Bilgiler değiştirildikten sonra Update butonuna basıldığında değişiklikler kaydedilir ve aynı zamanda ListPanel'e de yansıtılır

Sınıf ve Arayüzler

Sınıf ve Arayüzler

Contact List Birim Testleri private ContactListPresenter presenter; @Mock private ContactListPanel listpanel; @Mock private ContactDetailPanel detailpanel; @Mock private ContactService service; private Collection<Contact> contacts; @Mock private ContactUpdatedEvent event; @Mock private Contact contact;

Contact List Birim Testleri @Test public void contactsshouldbeshownwhenpageisloaded() { Mockito.verify(service).getContacts(); Mockito.verify(listPanel).loadContacts(contacts); @Test public void contactshouldbereloadedwhenupdated() { Mockito.verify(detailPanel).addContactUpdateListener(presenter); presenter.contactupdated(event); Mockito.verify(event).getContact(); Mockito.verify(listPanel).reloadContact(contact);

Contact List Presenter Impl. public ContactListPresenter(ContactListPanel listpanel, ContactDetailPanel detailpanel, ContactService service) { this.listpanel = listpanel; this.service = service; Collection<Contact> contacts = service.getcontacts(); listpanel.loadcontacts(contacts); detailpanel.addcontactupdatelistener(this); @Override public void contactupdated(contactupdatedevent event) { Contact contact = event.getcontact(); listpanel.reloadcontact(contact);

Contact List View Impl. public void loadcontacts(collection<contact> contacts) { BeanItemContainer<Contact> datasource = new BeanItemContainer<Contact>(Contact.class, contacts); table.setcontainerdatasource(datasource); table.setvisiblecolumns(new Object[] {"name","surname","email","phone"); table.setcolumnheaders(new String[]{"Name","Surname","E- Mail","Phone"); public void valuechange(valuechangeevent event) { Contact contact = (Contact) table.getvalue(); ContactSelectedEvent selectedevent = new ContactSelectedEvent(contact); for(contactselectionlistener listener:listeners) { listener.contactselected(selectedevent);

Contact List View Impl. @Override public void reloadcontact(contact contact) { BeanItemContainer container = (BeanItemContainer) table.getcontainerdatasource(); container.removeitem(contact); container.addbean(contact); table.requestrepaintall();

Contact Detail Birim Testleri @Mock private ContactDetailPanel detailpanel; @Mock private ContactListPanel listpanel; private ContactDetailPresenter presenter; @Mock private Contact contact; @Mock private ContactSelectedEvent event; @Test public void contactshouldbedisplayedindetailpanelwhenselected() { presenter.contactselected(event); Mockito.verify(detailPanel).displayContact(contact); Mockito.verify(event).getSelectedContact(); Mockito.verify(listPanel).addContactSelectionListener(presenter);

Contact Detail Presenter Impl. private ContactDetailPanel detailpanel; public ContactDetailPresenter(ContactDetailPanel detailpanel, ContactListPanel listpanel) { this.detailpanel = detailpanel; listpanel.addcontactselectionlistener(this); @Override public void contactselected(contactselectedevent event) { Contact contact = event.getselectedcontact(); detailpanel.displaycontact(contact);

Contact Detail View Impl. @Override public void displaycontact(contact contact) { BeanItem item = new BeanItem(contact); form.setitemdatasource(item); form.setvisibleitemproperties(new Object[] {"name","surname","email","phone","address"); @Override public void buttonclick(clickevent event) { Contact contact = (Contact) ((BeanItem) form.getitemdatasource()).getbean(); ContactUpdatedEvent updateevent = new ContactUpdatedEvent(contact); for(contactupdatelistener listener:listeners) { listener.contactupdated(updateevent);

ContactListPanel ve ContactDetailPanel ile etkileşime girecek bir bileşen daha eklenirse... Örneğin, update butonunun bulunduğu kısım bir ToolBarPanel bileşenine dönüştürülür ve update butonunun sadece Contact seçildiği zaman görünür olması istenirse nasıl bir problem ortaya çıkabilir?

Mediator Öncesi Bileşen Bileşen Bileşen Bileşen Bileşen

Örnek 4 Kullanıcımız bağlantılarını yönettiği uygulamasına benzer şekilde adres bilgilerini yönettiği bir uygulama istemektedir. Ancak uygulamanın bileşenlerinin mümkün olduğunca birbirlerinden bağımsız ve farklı bölümlerde yeniden kullanılabilir olmasına dikkat edilmesi istenmektedir.

UI Mockup Address List Panel Address Detail Panel AddressToolBarPanel

Sınıf ve Arayüzler

Sınıf ve Arayüzler

Sınıf ve Arayüzler

Sınıf ve Arayüzler

Mediator Impl. private Collection<MediatorEventListener> listeners = new ArrayList<MediatorEventListener>(); public void addlistener(mediatoreventlistener listener) { listeners.add(listener); public void removelistener(mediatoreventlistener listener) { listeners.remove(listener); public void fire(mediatorevent event) { for(mediatoreventlistener listener:listeners) { listener.handle(event);

Address List Presenter Impl. private AddressListPanel listpanel; public AddressListPresenter(AddressListPanel listpanel, AddressService addressservice) { this.listpanel = listpanel; listpanel.loadaddresses(addressservice.getaddresses()); @Override public void handle(mediatorevent event) { if(event instanceof AddressUpdatedEvent) { AddressUpdatedEvent updateevent = (AddressUpdatedEvent)event; listpanel.reloadaddress(updateevent.getaddress());

Address Detail Presenter Impl. private AddressDetailPanel detailpanel; public AddressDetailPresenter(AddressDetailPanel detailpanel) { this.detailpanel = detailpanel; @Override public void handle(mediatorevent event) { if(event instanceof AddressSelectedEvent) { AddressSelectedEvent selectedevent = (AddressSelectedEvent)event; detailpanel.displayaddress( selectedevent.getselectedaddress());

Address ToolBar Presenter Impl. private AddressToolBarPanel addresstoolbarpanel; public AddressToolBarPresenter(AddressToolBarPanel addresstoolbarpanel) { this.addresstoolbarpanel = addresstoolbarpanel; addresstoolbarpanel.swithtoselectionmode(); @Override public void handle(mediatorevent event) { if(event instanceof AddressSelectedEvent) { addresstoolbarpanel.swithtoupdatemode(); addresstoolbarpanel.setaddress( ((AddressSelectedEvent)event).getSelectedAddress()); else if(event instanceof AddressUpdatedEvent) { addresstoolbarpanel.swithtoselectionmode();

Address List View Impl. public AddressListPanelImpl(Mediator mediator) { this.mediator = mediator;... @Override public void loadaddresses(collection<address> addresses) {... @Override public void valuechange(valuechangeevent event) { Address address = (Address) table.getvalue(); AddressSelectedEvent selectedevent = new AddressSelectedEvent(address); mediator.fire(selectedevent);

Address ToolBar View Impl. public AddressToolBarPanelImpl(Mediator mediator) { this.mediator = mediator;... @Override public void setaddress(address address) { this.address = address; @Override public void buttonclick(clickevent event) { if(event.getbutton() == updatebutton) { mediator.fire(new AddressUpdatedEvent(address));

Mediator Sonrası Bileşen Bileşen Mediator Bileşen Bileşen Bileşen

Soru & Cevap

İletişim Harezmi Bilişim Çözümleri Ltd. Kurumsal Java Eğitimleri http://www.harezmi.com.tr http://www.java-egitimleri.com info@java-egitimleri.com