Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MVC - parte 1

MVC - parte 1

MVC - parte 1

Avatar for João Antonio Ferreira

João Antonio Ferreira

November 11, 2011
Tweet

Other Decks in Technology

Transcript

  1. MVC Por que precisamos disso ? Contexto do Problema Precisamos

    desenvolver um Aplicativo que irá apresentar conteúdo para vários usuários em numerosas visões contendo diversos dados. Além disso, a equipe de engenharia responsável pela concepção, implementação e manutenção do aplicativo é composto de indivíduos com diferentes habilidades incluindo analistas de produto, analistas de sistemas, engenheiros de software, engenheiros elétricos, mecânicos e de produção, além de WEB designers, administradores e economistas.
  2. MVC Problema Agora, mais do que nunca, aplicações empresariais necessitam

    de apoiar vários tipos de usuários com vários tipos de interfaces visuais diferentes. Por exemplo, uma loja online pode exigir uma visão HTML para clientes Web, uma visão WML para clientes wireless, um interface Java - Swing para os administradores, e um serviço Web baseado em XML ou JSON para fornecedores e parceiros (B2B)
  3. MVC Problema Aplicações extremamente simples podem misturar acesso a dados

    e lógica de regras de negócio com lógica específica para apresentação e controle. Tal abordagem, no entanto, é totalmente inadequada quando aplicado a sistemas corporativos que precisam suportar múltiplos clientes de tipos diferentes.
  4. MVC Forças e Restrições Dados da mesma empresa precisam ser

    acessados e apresentados em diferentes visões: HTML, WML, Swing, XML, JSON Dados da mesma empresa precisam ser atualizados por meio de interações diferentes: clique num link em uma página HTML ou WML, cliques de botão em uma GUI Swing, mensagens SOAP escritas em XML para requisitar Remote Procedure Call Apoiar os vários tipos de Visões e Interações não pode afetar os componentes que fornecem a funcionalidade principal do aplicativo corporativo
  5. MVC Solução Através da aplicação do padrão de projeto de

    arquitetura Model-View-Controller (MVC), podemos separar as funcionalidades do núcleo do modelo de negócio da lógica de apresentação e da lógica de controle que utiliza essas funcionalidades. Tal separação permite que múltiplas visões compartilhem o mesmo modelo de dados corporativo. Desta forma o suporte a vários clientes diferentes fica mais fácil de implementar, testar e principalmente manter.
  6. MVC Década de 1970 Interfaces visuais gráficas - GUI foram

    inventadas. Os arquitetos de software identificaram as três partes principais a serem consideradas nas aplicações : Parte que gerencia os Dados Parte que cria telas e relatórios Parte que manipula as interações entre o usuário e os outros subsistemas
  7. MVC Década de 1980 Smalltalk introduziu este Triunvirato como Framework

    de Desenvolvimento para Aplicações Visuais ObjectWorks® Smalltalk was an object-oriented system for developing color graphic applications that run unchanged on UNIX, PC and Macintosh workstations under their standard windowing system.
  8. MVC Década de 1980 No Dicionário Smalltalk temos: MODEL :

    Subsistema de Dados VIEW : Subsistema de Apresentação Controller : Subsistema de Interação
  9. MVC pode ser : Celular, Tablet, XML ou JSON FLEXIBILIDADE

    pode ser : teclas, mouse, track-pad, multi-touch ou invoke RPC
  10. MVC eventos Eventos: Pattern Observer Sob a lente dos Patterns

    Model Não guarda referência de View nem de Controller
  11. MVC Controller Model State Change View Change Notification User Gestures

    View Selection State Query Papéis dos Componentes Renderiza dados do Modêlo no Composite Requista atualizações ao Modêlo Envia Gestos do Usuário ao Controlador via Eventos Permite ao Controlador selecionar uma View VIEW
  12. MVC Controller Model State Change View Change Notification User Gestures

    View Selection State Query Papéis dos Componentes Recebe Eventos indicando Gestos do Usuário Define o Comportamento da Aplicação Mapeia Ações de Usuário em Atualizações no Modêlo Seleciona a View para responder ao Usuário CONTROLLER
  13. MVC Controller Model State Change View Change Notification User Gestures

    View Selection State Query Papéis dos Componentes Encapsula o Estado da Aplicação Responde a requisições sobre o Estado do Modelo Expõe as funcionalidades da Aplicação Notifica as View quando ocorre uma Alteração MODEL
  14. MVC a. Usuário clica no checkbox b. View notifica Controller

    c. Controller recebe gesto g d. Controller altera Model e. Controller seleciona* View f. Model notifica View g. View pede dados a Model h. View exibe dado modificado
  15. MVC a. Usuário clica no checkbox b. View notifica Controller

    c. Controller recebe gesto g d. Controller altera Model e. Controller seleciona* View f. Model notifica View g. View pede dados a Model h. View exibe dado modificado
  16. MVC a. Usuário clica no botão Processar b. View recebe

    evento via ActionListener c. Método privado é invocado d. Model é iniciado em outra Thread e. Model registra View como Observer f. Model notifica View sobre modificações g. View recebe novo estado de Model h. View atualiza barra de progresso i. Ao final a View habilita botão Limpar Primeiro Um Exemplo Simples sem Controller
  17. Exercicio MVC Primeiro um exemplo Simples sem Controller class MyModel

    extends Observable implements Runnable { public MyModel(Observer observador) { addObserver(observador); } public void run() { long i; for (i = 0; i <= MyView.ITERACTION_QTY; i++) { setChanged(); notifyObservers(new Long(i)); } // Notifica fim do processo setChanged(); notifyObservers(new Boolean(true)); } } Thread independente Notifica a View
  18. Exercicio MVC Primeiro um exemplo Simples sem Controller class MyView

    extends JFrame implements Observer { // . . . protected MyView() { Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); processBtn = new JButton("Processar"); clearBtn = new JButton("Limpar"); clearBtn.setEnabled(false); processBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { runProcess(0); } }); clearBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { processBtn.setEnabled(true); clearBtn.setEnabled(false); progressBar.setValue(0); text.setText(""); } }); text = new JTextField(""); progressBar = new JProgressBar(); progressBar.setSize(500, 20); contentPane.add(text, BorderLayout.CENTER); contentPane.add(processBtn, BorderLayout.NORTH); contentPane.add(clearBtn, BorderLayout.WEST); contentPane.add(progressBar, BorderLayout.SOUTH); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Window will be sized to fit the preferred size pack(); } } View implementa padrão Observer Usa o Padrão Composite de javax.swing.JFrame Eventos do próprio javax.swing
  19. Exercicio MVC Primeiro um exemplo Simples sem Controller class MyView

    extends JFrame implements Observer { // Numero de iterações para o loop de simulação do processo public static long ITERACTION_QTY = 1130L; // membros relacionados a interface visual private JProgressBar progressBar; private JButton processBtn; private JButton clearBtn; private JTextField text; private void runProcess(long i) { processBtn.setEnabled(false); (new Thread(new MyModel(this))).start(); System.out.println("\nCriando Nova Thread para Model..."); } public void update(Observable o, Object arg) { if (arg instanceof Long) { // Seta o valor da barra de progresso int percentual = (int) (((Long) arg * 100) / ITERACTION_QTY); progressBar.setValue(percentual); text.setText(" " + percentual); } else if (arg instanceof Boolean) { if (((Boolean) arg).booleanValue()) { progressBar.setValue(100); clearBtn.setEnabled(true); text.setText("FIM !"); System.out.print(" FIM ! "); } } } // . . . } invocado no inicio ao clicar no botão Processar Atualiza a View