1 Ağustos 2018 Çarşamba

Model View Presenter - MVP

Giriş
Java'da gerçekleştirilmiş bir Model-view-presenter projesindeki temel yapılar şöyleydi. Java arayüzleri sağlamadığı için herşey elle kodlanmıştı.

AbstractView Sınıfı

1. Tanım
Şöyle yaparız
public abstract class AbstractView <E extends Enum<E>> {...}
2. Map
Sınıf E enum'u ile Runnable'ları eşleştiren bir Map tutar.
Map<E,Runnable> m = ...;
3. postEvent metodu
postEvent metodu ile belirtilen E'yi çalıştıran Runnable tetiklenir. Runnable bir Executor ile çalıştırılır. Yani Presenter kodu farklı bir thread içinde tetiklenir.
void postEvent (E event) {...}
4. registerEvent metodu
Her view içinde ekran bileşenlerine atana ActionListener'lar postEvent metodunu tetikler.
Her bileşen için ayrı ayrı ActionListener yazmak yerine, bu sınıf
void registerEvent (E event,Component c) {...}
şeklinde ortak bir metod sunabilir. Bu metod içinde ActionListener yaratılır ve ActionListener postEvent(event)'i tetikler.

AbstractPresenter Sınıfı

1. Event ve Runnable Bağlama
Presenter'dan kalıtan sınıflar createRunnablesForEvent(E event) isimli bir metodu gerçekleştirir.

Presenter'ın createRunnables metodu E enum tipi üzerinde dolaşarak her enum için bir Runnable yaratır. Yaratılan runnable view nesnesine geçilir. View'da kendi içindeki Map'te bunu saklar.
void createRunnables () {
  1.Iterate over each enum and call createRunnable (E event); -> This creates a Runnable
  2.set Runnable to view by calling view.setRunnable (E event, Runnable r)
  3.view.fireEvent (E event); -> This calls Runnable
}
2. Business Logic
Tüm business logic Presenter içinde olmalı. Şöyle yaparız.
private boolean IsUsernameValid() {
  String username = addUserView.GetUsername();
  return (username != null && !username.isEmpty());
}

public void onSomethingClicked() {            

  if (IsUsernameValid()) {
    ...   
    // etc.
  }
}
Thread Bağlamı
MVP'de model değişince, View'u haberdar etmek için şu yöntemler var.

1. Presenter model'i günceller, GUI Thread'ine event send eder ve işlenmesini bekler. GUI modeli okurken Presenter thread'i çalışmadığı için model thread-safe olur

2. Presenter model'i günceller ve GUI Thread'in event post eder. View model'i okurken lock eder, işi bitince bırakır. Yani model thread safe mekanizma sağlar

3. EventBus kullanılır. Model'in verisi event nesnelerine kopyalanır. View aynı zamanda Listener' olduğu için event nesnelerini işler.



Hiç yorum yok:

Yorum Gönder