# 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:
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. 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. 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. 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 e Derek Greer.

## 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
* Echo2
* Vaadin
* ZK