Como utilizar o Vaadin em larga escala, fazendo que o seu codigo fique limpo e sem regras de negocio na camada de interface com o usuario, o assim chamado Smart UI em Domain-Drive Design. Nesse post veremos como utilizar o padrao MVC de forma simples numa arquitetura onde separa a camada de apresentacao da camada de negocio, que representaremos aqui como classes de casos de uso.MVCRelembrando o padrao MVC, onde o usuario inicia um evento, que e recebido por um Controller, este acessa um certo Model e atualiza os dados de um ou mais Views, podemos ter o seguinte fluxo abaixo:fonte: http://best-practice-software-engineering.ifs.tuwien.ac.at/patterns/mvc.htmlCaso de Uso Vamos analisar o fluxo do caso de uso Abrir Conta Bancaria, onde ao clicar no botao Abrir Conta, e apresentada a tela abaixo e o usuario preenche Agencia, Nome do Cliente e RG, e o sistema cria uma conta bancaria. Abaixo veja o screenshot da tela final:Abaixo segue a sequencia de passos:ClassesVeja, que a aplicacao inicia quando o usuario acessa o site, onde e criada uma instancia da classe Main, que e uma Application do Vaadin. Veja o codigo abaixo:package naskar.ui;import naskar.application.AbrirContaUC;import naskar.application.ConsultarSaldoUC;import naskar.infrastructure.Controller;import naskar.infrastructure.View;import naskar.infrastructure.ViewManager;import naskar.infrastructure.WindowUtils;import com.vaadin.Application;import com.vaadin.ui.Button;import com.vaadin.ui.Component;import com.vaadin.ui.HorizontalLayout;import com.vaadin.ui.TabSheet;import com.vaadin.ui.VerticalLayout;import com.vaadin.ui.Window;import com.vaadin.ui.Button.ClickEvent;import com.vaadin.ui.Button.ClickListener;import com.vaadin.ui.TabSheet.Tab;@SuppressWarnings("serial")public class Main extends Application implements ViewManager { // controllers private Controller abrirContaController = new AbrirContaController(new AbrirContaUC()); private Controller consultarSaldoController = new ConsultarSaldoController(new ConsultarSaldoUC()); // components private Window mainWindow = new Window("Vaadin MVC"); private TabSheet tabs = new TabSheet(); @Override public final void init() { this.setMainWindow(crieWindow()); } public final Window crieWindow() { tabs.setSizeFull(); mainWindow.addComponent(crieAcoes()); mainWindow.addComponent(tabs); ((VerticalLayout) mainWindow.getContent()).setExpandRatio(tabs, 3); return mainWindow; } private Component crieAcoes() { HorizontalLayout hl = new HorizontalLayout(); hl.addComponent(crieAcao("Abrir Conta", abrirContaController)); hl.addComponent(crieAcao("Consultar Saldo", consultarSaldoController)); return hl; } private Component crieAcao(final String nome, final Controller controller) { // cada acao sera um botao Button b = new Button(nome); b.addListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { // inicia o controller, que retorna uma view View view = controller.init(_this()); Component c = view.getComponent(); // ao clicar ele ira criar uma nova tab Tab t = tabs.addTab(c, nome, null); t.setClosable(true); tabs.setSelectedTab(c); } }); return b; } public Main _this() { return this; } // ViewManager @Override public void close(View view) { // remove a view da TabSheet tabs.removeComponent(view.getComponent()); } @Override public void showMsg(String msg) { WindowUtils.showMsg(mainWindow, msg); } @Override public void showError(String error) { WindowUtils.showError(mainWindow, error); } @Override public Window getWindow() { return mainWindow; } }Na classe Main, sao criados os Controllers e os Casos de Uso, e e montado a Window com os respectivos botoes para cada Controller.(Voce tambem integrar sua camada de negocio usando o Spring)Apos isso, o usuario clica no botao Abrir Conta, onde o objeto da classe Main aciona AbrirContaController, que cria e retorna uma instancia de AbrirContaView. E nesse momento que o Controller pode acessar a camada de negocio para obter dados para passar para a View, como listas de entidades para Grids, ComboBox, etc@Overridepublic void buttonClick(ClickEvent event) { // inicia o controller, que retorna uma view View view = controller.init(_this()); Component c = view.getComponent(); // ao clicar ele ira criar uma nova tab Tab t =