MVP, Observer ve Mediator Örüntüleri ile Yeniden Kullanılabilir Uygulama Bileşenleri Geliştirme
Kenan Sevindik Kimdir? 1999 ODTÜ Bilgisayar Müh. mezunu 15 yılın üzerinde kurumsal uygulama geliştirme deneyimi var Pek çok projenin geliştirilmesinde görev aldı Object Oriented ve Aspect Oriented Programlama, Tasarım Örüntüleri gibi konularda, Spring, Spring Security, Hibernate, Vaadin gibi kurumsal Java teknolojilerinde bilgi birikimi ve deneyime sahip
Kenan Sevindik Kimdir? Beginning Spring kitabının yazarlarından 2011 yılında Harezmi Bilişim Çözümlerini kurdu Kurumsal uygulama geliştirme faaliyetleri yürütüyor Danışmanlık ve koçluk hizmetleri sunuyor Kurumsal Java Eğitimleri adı altında eğitimler düzenliyor
Mimarisel Bir Örüntü: MVC Controller Kullanıcı girdileri ve UI olayları Veri değişiklikleri Bildirimler Model View Veri erişimi
MVC & Observer Observer 1 notify notify Subject Observer 2 notify Observer 3 Subject changed...
MVC'nin Temel İşlevi Seperation of Concern
Kurumsal Uygulamalarda Katmanlı Mimari UI Service DAO DB
Kurumsal Java Dünyasında MVC Yorumlaması Controller Model View User Web MVC veya MVC2 olarak adlandırılmıştır
Web MVC ve Front Controller Web Container request handle delegate request request Request Front Controller Handler model response create model model render response View Struts, Spring MVC, JSF gibi pek çok Web Framework'üne temel teşkil etmiştir
Kurumsal Uygulamalarda Katmanlı Mimari Presentation Controller Service DAO DB
Katmanlı Mimari ve Modülerlik Finans Personel Presentation Controller Service DAO DB Doküman
Katmanlı Mimari ve Modülerlik Presentation Presentation Presentation Controller Controller Controller Service Service Service DAO DAO DAO DB
Katmanlı Mimari ve Modülerlik Presentation Presentation Presentation Controller Controller Controller Service DAO DB
Katmanlı Mimari ve Modülerlik Presentation Presentation Presentation Controller Controller Controller Service Service Service DAO DAO DAO DB
Bileşenler Arasındaki Etkileşim Bileşen Bileşen Bileşen
Bileşenler Arasındaki Etkileşim Bileşen Bileşen Bileşen Bileşen Bileşen
MVC'nin Problemleri MVC örüntüsü, mimarisel olarak sistemi işlevsel açıdan modülerize etmeye yardımcı olmaktadır Ancak kullanıcı etkileşimlerinin fonksiyonel davranışa nasıl dönüştürüleceği ile ilgili net bir yol gösterememektedir Bileşenler arasındaki iletişimi düzenleyememektedir ve bileşenlerin birbirleri ile aralarındaki bağımlılıkları da tam olarak ortadan kaldıramamaktadır
Çözüm: MVP + Mediator MVC'nin bir varyasyonu olan MVP, kullanıcı arayüzünün gösterimi ve fonksiyonel davranışların birbirlerinden bağımsız biçimde ele alınabilmesini sağlamaktadır Mediator ise bileşenler arasındaki iletişimi düzenleyip, bağımlılıkları ortadan kaldırmaktadır
Model View Presenter UI event'leri uygulamaya özel business event'lere dönüştürülür Presenter View UI üzerindeki değişiklikler Presenter tarafından yansıtılır Model üzerindeki değişiklikler Event'ler ile Presenter'a iletilir Presenter Model üzerinde değişiklik yapabilir Model verisine erişebilir Model
Bileşenler Arasındaki Etkileşim Kaosu
Mediator
Mediator Sonrası Bileşenler Arasındaki Etkileşim Bileşen notify event publish Bileşen Mediator Bileşen notify notify notify Bileşen Bileşen
Mediator Sonrası Bileşenler Arasındaki Etkileşim Presentation Presentation Presentation Controller Controller Controller Service DAO Event Context (Event & Model) Service DAO DB Event Context (Event & Model) Service DAO
Örnek: Adres Bilgileri Yönetim Ekranı Address Detail View Address List View Address ToolBar View
Mediator public class Mediator { private Collection<Presenter> listeners = new ArrayList<Presenter>(); public void addlistener(presenter listener) { listeners.add(listener); public void removelistener(presenter listener) { listeners.remove(listener); public void publish(businessevent event) { for(presenter listener:listeners) { listener.handle(event);
Presenter public interface public void Presenter { handle(businessevent event);
Adım 1: Mediator Registration ListView DetailView ListPresenter Detail Presenter Mediator Bileşen, diğer bileşenlerdeki değişikliklerden haberdar olmak için kendisini mediator'a register eder ToolBar Presenter ToolBar View Bileşen, diğer bileşenlerdeki değişikliklerden haberdar olmak için kendisini mediator'a register eder Bileşen, diğer bileşenlerdeki değişikliklerden haberdar olmak için kendisini mediator'a register eder
Address List Presenter public class AddressListPresenter implements Presenter { private AddressListView view; private Mediator mediator; public AddressListPresenter(AddressListView view, Mediator mediator) { this.view = view; this.mediator = mediator; mediator.addlistener(this); @Override public void handle(businessevent event) {...
Address Detail Presenter public class AddressDetailPresenter implements Presenter { private AddressDetailView view; private Mediator mediator; public AddressDetailPresenter(AddressDetailView view, Mediator mediator) { this.view = view; this.mediator = mediator; mediator.addlistener(this); @Override public void handle(businessevent event) {...
Address ToolBar Presenter public class AddressToolBarPresenter implements Presenter { private AddressToolBarView view; private Mediator mediator; public AddressToolBarPresenter(AddressToolBarView view, Mediator mediator) { this.view = view; this.mediator = mediator; mediator.addlistener(this); @Override public void handle(businessevent event) {...
Adım 2:UI Interaction (Item Select) Listeden herhangi bir item'ın seçilmesi bir UI event tetikler ListView UI event, doğrudan bir business event'e dönüştürülür ve mediator üzerinden fire edilir DetailView ListPresenter Detail Presenter ToolBar Presenter ToolBar View Mediator
Address List View public class AddressListView implements ValueChangeListener { public AddressListView(Mediator mediator) { this.mediator = mediator; @Override public void valuechange(valuechangeevent event) { Address address = (Address) table.getvalue(); AddressSelectedEvent selectedevent = new AddressSelectedEvent(address); mediator.publish(selectedevent);...
Adım 3:Event Notification (Address Selected) ListView DetailView Mediator business event ile ilgilenen diğer bileşenleri haberdar eder ListPresenter Mediator UI state güncellenir ToolBar Presenter ToolBar View Mediator business event ile ilgilenen diğer bileşenleri haberdar eder Presenter'lar business event'in işaret ettiği iş mantığını servis katmanı üzerinden yürütürler UI state güncellenir Detail Presenter Service DAO
Address Detail Presenter public class AddressDetailPresenter implements Presenter { @Override public void handle(businessevent event) { if(event instanceof AddressSelectedEvent) { AddressSelectedEvent selectedevent = (AddressSelectedEvent)event; Address address = selectedevent.getselectedaddress(); view.displayaddress(address);...
Address ToolBar Presenter public class AddressToolBarPresenter implements Presenter { @Override public void handle(businessevent event) { if(event instanceof AddressSelectedEvent) { AddressSelectedEvent selectedevent = (AddressSelectedEvent)event; Address address = selectedevent.getselectedaddress(); view.switchtoupdatemode(); view.setaddress(address);...
Address Selected
Adım 2:UI Interaction (Update Button Click) ListView DetailView ListPresenter Detail Presenter Mediator ToolBar Presenter Bir buton'a tıklanması UI event tetikler ToolBar View UI event, doğrudan bir business event'e dönüştürülür ve mediator üzerinden fire edilir
Address ToolBar View public class AddressToolBarView implements ClickListener { public AddressToolBarView(Mediator mediator) { this.mediator = mediator; @Override public void buttonclick(clickevent event) { if(event.getbutton() == updatebutton) { AddressUpdateEvent updateevent = new AddressUpdateEvent(address); mediator.publish(updateevent);...
Adım 3:Event Notification (Address Update) Service Presenter'lar business event'in işaret ettiği iş mantığını servis katmanı üzerinden yürütürler ListView UI state güncellenir DAO DetailView Mediator business event ile ilgilenen diğer bileşenleri haberdar eder ListPresenter ToolBar Presenter Mediator ToolBar View Mediator business event ile ilgilenen diğer bileşenleri haberdar eder UI state güncellenir Detail Presenter
Address List Presenter public class AddressListPresenter implements Presenter { @Override public void handle(businessevent event) { if(event instanceof AddressUpdateEvent) { AddressUpdateEvent updateevent = (AddressUpdateEvent)event; Address address = updateevent.getaddress(); view.reloadaddress(address);...
Address ToolBar Presenter public class AddressToolBarPresenter implements Presenter { @Override public void handle(businessevent event) { if(event instanceof AddressSelectedEvent) { AddressSelectedEvent selectedevent = (AddressSelectedEvent)event; Address address = selectedevent.getselectedaddress(); view.switchtoupdatemode(); view.setaddress(address); else if(event instanceof AddressUpdateEvent) { view.switchtoselectionmode();...
Address Updated
Soru & Cevap
İletişim Harezmi Bilişim Çözümleri A.Ş. http://www.harezmi.com.tr info@harezmi.com.tr