[MVP] - One Presenter for each View

Hi everybody,

i need some help with the mvp pattern which i´m using in my application for the first time.
is there one big presenter which “knows” all the views and the model
is there a presenter for each view?

Thanks for your help


typically there’s a dedicated presenter for each view - otherwise you could quickly get a huge presenter which would not be maintainable or very clear.


ok thank you.

then i was right and my coworker wrong :smiley:

another short question:

i´m using the viewprovider class from the dashboard example:

public class DashboardNavigator extends Navigator {

    private static final DashboardViews ERROR_VIEW = DashboardViews .SOURCE;
    private ViewProvider errorViewProvider;

    public DashboardNavigator (final ComponentContainer container) {
        super(UI.getCurrent(), container);



    private void initViewChangeListener() {
        addViewChangeListener(new ViewChangeListener() {

            public boolean beforeViewChange(final ViewChangeEvent event) {
                // Since there's no conditions in switching between the views
                // we can always return true.
                return true;

            public void afterViewChange(final ViewChangeEvent event) {
                DashboardViews view = DashboardViews.getByViewName(event.getViewName());
                // Appropriate events get fired after the view is changed.
                MyEventBus.post(new PostViewChangeEvent(view));
                MyEventBus.post(new BrowserResizeEvent());
                MyEventBus.post(new CloseOpenWindowsEvent());


    private void initViewProviders() {
        // A dedicated view provider is added for each separate view type
        for (final DashboardViews viewType : DashboardViews.values()) {
            ViewProvider viewProvider = new ClassBasedViewProvider(viewType.getViewName(), viewType.getViewClass()) {

                // This field caches an already initialized view instance if the
                // view should be cached (stateful views).
                private View cachedInstance;

                public View getView(final String viewName) {
                    View result = null;
                    if (viewType.getViewName().equals(viewName)) {
                        if (viewType.isStateful()) {
                            // Stateful views get lazily instantiated
                            if (cachedInstance == null) {
                                cachedInstance = super.getView(viewType
                            result = cachedInstance;
                        } else {
                            // Non-stateful views get instantiated every time
                            // they're navigated to
                            result = super.getView(viewType.getViewName());
                    return result;

            if (viewType == ERROR_VIEW) {
                errorViewProvider = viewProvider;


        setErrorProvider(new ViewProvider() {
            public String getViewName(final String viewAndParameters) {
                return ERROR_VIEW.getViewName();

            public View getView(final String viewName) {
                return errorViewProvider.getView(ERROR_VIEW.getViewName());

the views are created in the “getView” method. but where should i add my presenter implementation?
Normaly i solve this problem like this: (https://vaadin.com/book/-/page/advanced.architecture.html)

// Create the model and the Vaadin view implementation
CalculatorModel    model = new CalculatorModel();
CalculatorViewImpl view  = new CalculatorViewImpl();
// The presenter binds the model and view together
new CalculatorPresenter(model, view);
// The view implementation is a Vaadin component


Well, it can be done in a lot of various ways. The way I usually do it is that when you instantiate the view, it will create it’s own presenter and hook the view instance to it.

hmm ok thats one way to solve this problem but i want a way where the view doesnt know the presenter