Diese Webseite verwendet Cookies. Durch die Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Datenschutzinformationen

11.01.2016Dr. Stefan ReisnerSoftware Manufaktur

VaadinSpring und das Model-View-Presenter-Pattern (Teil 2/2)

In Teil 1 habe ich die Umsetzung des Model-View-Presenter-Patterns in VaadinSpring-Projekten an einem sehr simplen View demonstriert (Like-Button). In realen Anwendungen sind die Views wesentlich komplexer. Man kann einigen Entwicklungsaufwand einsparen, indem man wiederkehrende Elemente modularisiert. Was bedeuten solche View-Module aber für das MVP-Pattern?

Im ersten Teil habe ich die Umsetzung von MVP in VaadinSpring-Projekten an einem sehr simplen View demonstriert: dem Like-Button. In realen Anwendungen sind die Views wesentlich komplexer. Allerdings kann man Entwicklungsaufwand einsparen, wenn man diese Views aus wiederverwendbaren Modulen aufbaut. Was bedeuten View-Module aber für das MVP-Pattern?

Presenter-Interfaces

Wir möchten einen BlogView realisieren, der aus einer Textanzeige, einem Kommentarfeld und dem LikeView aus Teil 1 besteht. Um den LikeView in diesen BlogView integrieren zu können, muss LikeView also mit dessen BlogPresenter zusammenarbeiten können. Dazu realisieren wir sowohl LikePresenter als auch BlogPresenter als Interfaces. BlogPresenter beerbt LikePresenter, damit seine Instanzen als LikePresenter fungieren können. BlogPresenter fügt eine Methode commentChanged hinzu, die Benutzereingaben im Kommentarfeld verarbeitet.

public interface BlogPresenter extends LikePresenter {
    void commentChanged(String value);
}

Der Master-Presenter

Ein wesentliches Prinzip von MVP ist, dass zu jedem Zeitpunkt immer nur ein einziger Presenter den Top-Level-View mit allen seinen View-Modulen steuert. Ich bezeichne diesen Presenter hier als Master-Presenter. Unseren BlogViewVn lassen wir durch das VaadinSpring-Framework instanziieren. Im Konstruktor erzeugt BlogViewVn seinen eigenen BlogPresenterMaster.

    @Autowired
    public BlogViewVn(MyService myService) {
        this();
        setBlogPresenter(new BlogPresenterMaster(this, myService));
    }

BlogPresenterMaster implementiert das Interface BlogPresenter und damit auch LikePresenter. Letzteres geschieht durch Ableitung von LikePresenterMaster (hier nicht gezeigt).

public class BlogPresenterMaster extends LikePresenterMaster implements BlogPresenter {
    private BlogView blogView;
    
    protected BlogPresenterMaster(BlogView blogView, MyService blogService) {
        super(blogView.getLikeView(), myService);
        this.blogView = blogView;
    }

    @Override
    public void commentChanged(String text) {
        blogService.getCommentRepository().save(new Comment().withText(text));
    }
}

Alles zusammenbauen

Beim Aufbau des Layouts des BlogViewVn sorgen wir einerseits dafür, dass das Kommentarfeld seine Ereignisse an den BlogPresenter senden wird, und wir instanziieren auch den LikeViewVn.

    public BlogViewVn() {
        VerticalLayout vlayout = new VerticalLayout();
        content = new TextArea();
        vlayout.addComponent(content);
        likeView = new LikeViewVn();
        vlayout.addComponent(likeView);
        comment = new TextField();
        comment.addValueChangeListener(event -> {
            if (!comment.isEmpty()) {
                blogPresenter.commentChanged(comment.getValue());
                comment.clear();
            }
        });
        vlayout.addComponent(comment);
        setCompositionRoot(vlayout);
    }

Wenn der Konstruktor oben ausgeführt wird, ist der BlogPresenter noch nicht verfügbar. Er wird erst anschließend über den Setter BlogView.setBlogPresenter() injiziert. Dieser gibt den BlogPresenter als LikePresenter dann auch an den LikeViewVn weiter.

    public void setBlogPresenter(BlogPresenter blogPresenter) {
        this.blogPresenter = blogPresenter;
        likeView.setLikePresenter(blogPresenter);
    }

Slave-Presenter

Was tun, wenn ein View mehrere Like-Buttons enthalten soll (z.B. in einer Artikelliste)? Der Master-Presenter kann LikePresenter nicht mehrfach implementieren. Es geht auch anders: der Master-Presenter kann beliebig viele Implementierungen von LikePresenter über eine Methode getLikePresenter(int index) zur Verfügung stellen. Diese "Slave-Presenter" können mit dem Master-Presenter verbunden sein, so dass sie insgesamt wie ein Master fungieren können.

Fazit

Nach diesem Prinzip lassen sich beide wichtigen Design-Ziele erreichen:

  • Trennung der Logik im Presenter von der konkreten UI-Implementierung des Views zwecks Testbarkeit
  • Wiederverwendbarkeit sowohl der Logik als auch der UI-Implementierung.

Begleiten Sie unseren Mitarbeiter Syngenius

Beiträge filtern

 

nach Kategorie

UnternehmenKarriereDigital PaymentDigitaler KundenzugangSoftware Manufaktur

nach Autor

Alexander LazarevićChristian RäderDirk MögenburgJörg SteinElmar BorgmeierMark SpiesslMichael AitaMichael MaleikaNicole KunzeDr. Stefan ReisnerTanja Everartz

nach Themen

Es sind Themen dabei, die Sie besonders interessieren?

Dann ist unser Infodienst was für Sie. Geben Sie einfach Ihre E-Mail-Adresse an und wählen Sie Ihre Themen aus. Wir benachrichtigen Sie, sobald es dazu etwas Neues gibt.

© SYNGENIO AG EXZELLENZ. BEGEISTERUNG. VERANTWORTUNG. INNOVATION.