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.
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)
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.
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
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.
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
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.
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
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
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
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
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
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
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
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