Model-view-presenter

Model–view–presenter (MVP) é uma derivação do padrão de software model-view-controller (MVC), usado também para construir principalmente interfaces gráficas.

Em MVP a camada Presenter assume a função de mediadora (executada pelo Controller em MVC). Além disso, a View é responsável por manipular os eventos UI (como mouseDown, keyDown, etc.), que era o trabalho da Controller. Finalmente, a Model se torna estritamente um modelo de domínio.

Descrição do padrão

MVP é um padrão de desenho de interface de usuário projetado para facilitar os testes unitários automatizados e melhorar a separação de interesses em lógica de apresentação:

  • Model é uma interface que define o modelo de dados que será exibido ou alterado na interface do usuário.
  • View é uma interface que exibe de fato os dados (o modelo) e guia os comandos do usuário (eventos) à camada Presenter para atuar sobre os dados.
  • A interface Presenter atua sobre a Model e a View. Ela recupera os dados dos repositórios (modelo), e os formata para exibi-los na View.

Normalmente, a implementação da View instancia o objeto Presenter concretamente, provendo uma referência a si mesmo. O código em C# a seguir demonstra um construtor View simples, onde ConcreteDomainPresenter implementa a interface IDomainPresenter:

public class DomainView: IDomainView
{
    private IDomainPresenter domainPresenter;

    public DomainView()   // Construtor
    {
        this.domainPresenter = new ConcreteDomainPresenter(this);
    }
}

O grau de lógica permitido na View varia entre implementações diferentes.

Como extremo, a View é completamente passiva, encaminhando todas operações de interação à interface presenter. Dessa forma, quando um usuário dispara um evento na view, ele não faz nada, mas invoca o método da Presenter o qual não tem parâmetros e não retorna valor. A interface Presenter então recupera os dados da View através dos métodos definidos pela interface View. Finalmente, a presenter então opera na interface model e atualiza a View com os resultados na operação.

Outras versões de model-view-presenter permitem certa liberdade em relação à classe que manipula uma interação, evento ou comando particular. Isto é normalmente mais adequado para arquiteturas baseadas na web, onde a View, a qual executa no browser do cliente, pode ser melhor colocada para manipular interação ou comando.

Do ponto de vista de camada, a classe Presenter pode ser considerada como pertencendo à camada de aplicação em um sistema de arquitetura multicamada com camadas comuns, mas ela também pode ser vista como uma camada Presenter de si mesma entre a camada de aplicação e a camada de interface do usuário.

História

O padrão de software Model-View-Presenter surgiu no início dos anos 90 na Taligent - uma joint venture da Apple, IBM e HP, e era o modelo de programação básico para desenvolvimento de aplicação no ambiente comum baseado em C++ na Taligent. O padrão foi depois migrado pela Taligent para Java e popularizado em um artigo pela Taligent CTO Mike Potel.[1] Depois a falência da Taligent em 1997, Andy Bower e Blair McGlashan do Dolphin Smalltalk adaptaram o padrão MVP para formar a base para seu framework de interface de usuário Smalltalk.[2] Em 2006, a Microsoft começou a incorporar o MVP em suas documentações e exemplos para a programação de interface de usuário no .NET framework.[3] As evoluções e múltiplas variações do padrão MVP, incluindo o relacionamento do MVP com outros padrões de desenho como o MVC, foram analisados detalhadamente em artigos por Martin Fowler[4] e Derek Greer.[5]

Implementação em .NET

O ambiente .NET suporta o padrão MVP como qualquer outro ambiente de desenvolvimento. A mesma classe Model e Presenter pode ser usada para suportar múltiplas interfaces, como uma aplicação Web ASP.NET, uma aplicação Windows Forms, ou uma aplicação Silverlight. A camada Presenter obtém e envia informação de/para a View através de uma interface que pode ser acessada pelo componente de interface (View).

Além de implementar manualmente o padrão, um framework de Model-View-Presenter pode ser usado para dar suporte ao padrão MVP de uma forma mais automatizada. A seguir, uma lista desses frameworks sob a plataforma .NET.

Frameworks

  • Claymore
  • MVC# Framework
  • Web Client Software Factory
  • Evolution.Net MVP Framework
  • ASP.NET Web Forms Model-View-Presenter (MVP)
  • NETTE Framework
  • Nucleo.NET

Implementação em Java

Em uma aplicação Java (AWT/Swing/SWT), o padrão MVP pode ser usado permitindo que uma classe de interface de usuário implemente uma interface View.

A mesma abordagem pode ser usada para aplicações Java baseadas na web desde que frameworks web Java baseados em componentes permitem desenvolvimento lógico do lado cliente usando a mesma abordagem de componente como clientes familiares.

Implementar MVP no Google Web Toolkit exige apenas que algum componente implemente a interface view. A mesma abordagem é possível usando o frameword para web Echo2.

MVP pode ser implementado em aplicações Java SE (Swing and AWT) usando o framework Biscotti.

Frameworks

  • Swing
  • JFace
  • Google Web Toolkit[6]
  • Echo2
  • Vaadin
  • ZK

Ver também

  • Presenter First
  • MVC (Model-View-Controller)
  • Common layers in an information system logical architecture
  • Model View ViewModel

Referências

  1. "MVP: Model-View-Presenter. The Taligent Programming Model for C++ and Java." Mike Potel
  2. "Twisting the Triad. The evolution of the Dolphin Smalltalk MVP application framework." Andy Bower, Blair McGlashan
  3. «"Microsoft patterns and practices"». Consultado em 26 de janeiro de 2012. Arquivado do original em 2 de junho de 2012 
  4. "GUI Architectures" Martin Fowler
  5. "Interactive Application Architecture Patterns" Derek Greer
  6. Large scale application development and MVP from GWT project's web site. It explains how to use MVP within GWT.