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

Developing Reusable Software Components Using MVP, Observer and Mediator Patterns at VoxxedDays Istanbul 2015

Embed Size (px)

Citation preview

MVP, Observer ve Mediator Örüntüleri ile

Yeniden Kullanılabilir Uygulama Bileşenleri

Geliştirme

Kenan Sevindik Kimdir?

● 15 yıllık kurumsal uygulama geliştirme deneyimi var

● Çeşitli projelerin mimarilerinin oluşturulmasında görev aldı

● Spring, Spring Security, Hibernate, Vaadin gibi kurumsal Java teknolojilerinde kapsamlı 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üyoruz

● Danışmanlık ve koçluk hizmetleri sunuyoruz

● Kurumsal Java Eğitimleri adı altında eğitimler düzenliyoruz

Katmanlı Mimari

UI

Service

DAO

DB

Controller

Veri değişiklikleri

Kullanıcı girdilerive UI olayları

Bildirimler

Veri erişimi

Model View

Mimarisel Bir Örüntü: MVC

MVC & Observer

Subject

Observer 1

Observer 2

Observer 3

Subject changed...

notify

notify

notify

MVC'nin Temel İşlevi

“Seperation of Concern”

Günümüzdeki MVC Yorumlaması

Controller

View

Model

User

Front Controller

Front ControllerRequestHandler

View

model

request

response

delegate request handlerequest

createmodel

modelrenderresponse

Web Container

Katmanlı Mimari

Controller

Service

DAO

DB

Presentation

Katmanlı Mimari ve Modülerlik

Controller

Service

DAO

DB

Presentation

Katmanlı Mimari ve Modülerlik

DB

Controller

Service

DAO

Presentation

Controller

Service

DAO

Presentation

Controller

Service

DAO

Presentation

Katmanlı Mimari ve Modülerlik

Service

DAO

DB

Controller

Presentation

Controller

Presentation

Controller

Presentation

Katmanlı Mimari ve Modülerlik

DB

Controller

Presentation

Service

DAO

Controller

Presentation

Controller

Presentation

Service

DAO

Service

DAO

Bileşenler Arasındaki Etkileşim

Bileşen

Bileşen

Bileşen

Bileşenler Arasındaki Etkileşim

Bileşen

BileşenBileşen

Bileşen

Bileşen

MVC'nin Problemleri

● MVC örüntüsü, mimarisel olarak sistemi işlevsel açıdan modülerize etmektedir

● Ancak kullanıcı etkileşimlerinin fonksiyonel davranışa nasıl dönüştürüleceği ile ilgili net bir yol göstermemektedir

● Bileşenler arasındaki iletişimi düzenleyememektedir ve bileşenlerin birbirleri ile aralarındaki bağımlılıkları 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

Presenter

Model

UI event'leri uygulamaya özel business event'lere dönüştürülür

UI üzerindeki değişikliklerPresenter tarafından yansıtılır

Model üzerindekideğişikliklerEvent'lerile Presenter'ailetilir

PresenterModel üzerindedeğişiklikyapabilir

Model verisineerişebilir

View

Bileşenler Arasındaki Etkileşim

Mediator

Mediator Sonrası Bileşenler Arasındaki Etkileşim

Bileşen

BileşenBileşen

Bileşen

Bileşen

Mediator

event publish

notify

notify

notify

notify

Mediator Sonrası Bileşenler Arasındaki Etkileşim

DB

Controller

Presentation

Service

DAO

Controller

Presentation

Controller

Presentation

Service

DAO

Service

DAO

EventContext(Event

&Model)

EventContext

(Event&

Model)

Örnek: Adres Bilgileri Yönetim Ekranı

AddressListView

AddressDetailView

Address ToolBar View

Mediatorpublic 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);}

}}

Mediator

ListView

ListPresenter

Bileşen, diğer bileşenlerdekideğişikliklerden haberdar olmakiçin kendisini mediator'a registereder

Tool

Bar

Pre

sent

er

Tool

Bar

Vie

w

DetailView

DetailPresenter

Bileşen, diğer bileşenlerdekideğişikliklerden haberdar olmakiçin kendisini mediator'a registereder

Bileşen, diğer bileşenlerdekideğişikliklerden haberdar olmakiçin kendisini mediator'a registereder

Adım 1: Mediator Registration

Address List Presenterpublic class AddressListPresenter implements Presenter {

private AddressListView view;

public AddressListPresenter(AddressListView view,Mediator mediator) {

this.view = view;mediator.addListener(this);

}

@Overridepublic void handle(BusinessEvent event) {

...}

}

Address Detail Presenterpublic class AddressDetailPresenter implements Presenter {

private AddressDetailView view;

public AddressDetailPresenter(AddressDetailView view, Mediator mediator) {

this.view = view;mediator.addListener(this);

}

@Overridepublic void handle(BusinessEvent event) {

...}

}

Address ToolBar Presenterpublic class AddressToolBarPresenter implements Presenter {

private AddressToolBarView view;

public AddressToolBarPresenter(AddressToolBarView view, Mediator mediator) {

this.view = view;mediator.addListener(this);

}

@Overridepublic void handle(BusinessEvent event) {

...}

}

Mediator

ListView

ListPresenter

Listeden herhangi bir item'ınseçilmesi bir UI event tetikler

UI event, doğrudan birbusiness event'e dönüştürülürve mediator üzerinden fire edilir

Tool

Bar

Pre

sent

er

Tool

Bar

Vie

w

DetailView

DetailPresenter

Adım 2:UI Interaction (Item Select)

Address List Viewpublic class AddressListView implements ValueChangeListener {

public AddressListView(Mediator mediator) {this.mediator = mediator;

}

@Overridepublic void valueChange(ValueChangeEvent event) {

Address address = (Address) table.getValue();

AddressSelectedEvent selectedEvent = new AddressSelectedEvent(address);

mediator.publish(selectedEvent);}

...}

Mediator

ListView

ListPresenter

UI stategüncellenir

DetailView

DetailPresenter

UI stategüncellenir

Tool

Bar

Pre

sent

er

Tool

Bar

Vie

w

Mediator business eventile ilgilenen diğerbileşenleri haberdareder

Mediator business eventile ilgilenen diğerbileşenleri haberdareder

DAO

ServicePresenter'larbusiness event'inişaret ettiği işmantığını serviskatmanı üzerindenyürütürler

Adım 3:Event Notification (Address Selected)

Address Detail Presenterpublic class AddressDetailPresenter implements Presenter {

@Overridepublic void handle(BusinessEvent event) {

if(event instanceof AddressSelectedEvent) {AddressSelectedEvent selectedEvent =

(AddressSelectedEvent)event;Address address =

selectedEvent.getSelectedAddress();view.displayAddress(address);

}}

...}

Address ToolBar Presenterpublic 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

Mediator

ListView

ListPresenter

Tool

Bar

Pre

sent

er

Tool

Bar

Vie

w

DetailView

DetailPresenter

Bir buton'atıklanması UIevent tetikler

UI event, doğrudan birbusiness event'e dönüştürülürve mediator üzerinden fire edilir

Adım 2:UI Interaction (Button Click)

Address ToolBar Viewpublic class AddressToolBarView implements ClickListener {

public AddressToolBarView(Mediator mediator) {this.mediator = mediator;

}

@Overridepublic void buttonClick(ClickEvent event) {

if(event.getButton() == updateButton) {AddressUpdateEvent updateEvent =

new AddressUpdateEvent(address);mediator.publish(updateEvent);

}}

...}

Mediator

ListView

ListPresenter

UI stategüncellenir

Mediator business eventile ilgilenen diğerbileşenleri haberdareder

Tool

Bar

Pre

sent

er

Tool

Bar

Vie

w

DetailView

DetailPresenter

UI stategüncellenir

Mediator business eventile ilgilenen diğerbileşenleri haberdareder

Adım 3:Event Notification(Address Update)

DAO

Service

Presenter'larbusiness event'inişaret ettiği işmantığını serviskatmanı üzerindenyürütürler

Address List Presenterpublic class AddressListPresenter implements Presenter {

@Overridepublic void handle(BusinessEvent event) {

if(event instanceof AddressUpdateEvent) {AddressUpdateEvent updateEvent =

(AddressUpdateEvent)event;

Address address = updateEvent.getAddress();

view.reloadAddress(address);

}}

...}

Address ToolBar Presenterpublic 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● [email protected]